32

我在使用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 mainmodule使用ipythonfrom时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

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

4

3 回答 3

50

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

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

或者你可以使用setuptools's 魔法功能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 不会扫描您的源代码树,而是试图通过查找__init__.py文件来确定哪些目录对应于 Python 包。)

于 2013-03-12T17:32:02.200 回答
6

您需要明确指定每个模块。不必每次都维护向 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"]),
于 2015-05-10T18:17:54.997 回答
0

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

于 2017-12-19T01:04:32.260 回答