使用setup.py安装包导入错误(Import error on installed packag

2019-08-17 12:25发布

我有使用问题setup.py安装一个Python包。 首先,我有以下的目录设置:

maindir
   |- setup.py
   |-mymodule
         |- __init__.py
         |- mainmodule.py
         |-subdir
             |- __init__.py
             |- submodule.py

即项目目录包含setup.py和目录mymodule ,这本身就包含了两个目录两个Python模块。 该文件submodule.py只包含

teststring = "hello world"

mainmodule.py包含:

from .subdir import submodule
mainstring = "42"

setup.py包含:

import os
from setuptools import setup
setup(
    name = "mytestmodule",
    version = "0.0.1",
    description = ("A simple module."),
    packages=['mymodule'],
)

当我from mymodule import mainmoduleipython从内sourceTest行为按预期工作,我可以引用如mainmodule.submodule.teststring这给我字符串hello world

在另一边,当我安装这个“包”使用python setup.py install和尝试做相同的(从其他目录内),我得到一个导入错误:

In [1]: from mymodule import mainmodule
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
/home/alexander/<ipython-input-1-cf4c9bafa487> in <module>()
----> 1 from mymodule import mainmodule

/home/alexander/build/bdist.linux-i686/egg/mymodule/mainmodule.py in <module>()

ImportError: No module named subdir

我不明白我做错了,我跟着入门教程和导入内包的规则 。 我想我的错误是一个非常微小的一个,但我看不出它和帮助表示赞赏。

Answer 1:

你必须列出所有软件包setup ,包括子包:

setup(
    name = "mytestmodule",
    version = "0.0.1",
    description = ("A simple module."),
    packages=['mymodule', 'mymodule.subdir'],
)

或者你可以使用setuptools的神奇功能find_packages

from setuptools import setup, find_packages
setup(
    name = "mytestmodule",
    version = "0.0.1",
    description = ("A simple module."),
    packages=find_packages(),
)

这是提到在这里 :

如果您有子包,他们必须明确在包装上市,但在package_dir任何条目自动延伸到子包。 (换句话说,Distutils的不扫描你的源代码树,试图通过寻找找出哪些目录对应于Python包 __init__.py文件。)



Answer 2:

您需要明确指定你的每一个模块。 相反,保持添加模块来setup.py每次的复杂性,你可以使用find_packages从方法setuptools

find_packages有两个可选参数:

  1. where其默认为'.' 即你的curdir。
  2. exclude的东西列表排除

我通常在我的回购测试,所以我用:

from setuptools import find_packages

packages=find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]),


Answer 3:

我有scriptname .py :main在我的setup.py console_scripts的.py是多余的。



文章来源: Import error on installed package using setup.py