使用setup.py导入已安装软件包的错误

Ale*_*lex 27 python import setuptools python-2.7

我在使用setup.py设置python包时遇到问题.首先,我有以下目录设置:

maindir
   |- setup.py
   |-mymodule
         |- __init__.py
         |- mainmodule.py
         |-subdir
             |- __init__.py
             |- submodule.py
Run Code Online (Sandbox Code Playgroud)

即项目目录包含setup.py和一个目录mymodule,该目录本身包含两个目录中的两个python模块.该文件submodule.py只包含

teststring = "hello world"
Run Code Online (Sandbox Code Playgroud)

mainmodule.py 包含:

from .subdir import submodule
mainstring = "42"
Run Code Online (Sandbox Code Playgroud)

setup.py包含:

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

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

另一方面,当我使用这个'package' 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
Run Code Online (Sandbox Code Playgroud)

我没有看到我做错了什么,因为我遵循了入门教程导入内部包的规则.我想我的错误是一个非常小的错误,但我无法发现它并且感谢帮助.

Pav*_*sov 44

您必须列出所有包setup,包括子包:

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

或者你可以使用setuptools魔法功能find_packages:

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

这在这里提到:

如果您有子包,则必须在包中明确列出它们,但package_dir中的任何条目都会自动扩展到子包.(换句话说,Distutils不会扫描您的源代码树,试图通过查找__init__.py文件来确定哪些目录对应于Python包.)


Shu*_*ary 6

您需要明确指定每个模块.您可以使用以下find_packages方法,而不是保持每次向setup.py添加模块的复杂性setuptools.

find_packages 有两个可选参数:

  1. where默认为'.'你的curdir.
  2. exclude 要排除的内容列表

我通常在我的仓库中进行测试,所以我使用:

from setuptools import find_packages

packages=find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]),
Run Code Online (Sandbox Code Playgroud)