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

时间:2013-03-12 17:29:29

标签: python import python-2.7 setuptools

我在使用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安装此'package'并尝试执行相同操作时(从其他目录中),我收到导入错误:

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

当我跟随Getting started tutorialrules for importing intra-packages时,我看不出我做错了什么。我想我的错误是一个非常小的错误,但我无法发现它并且感谢帮助。

3 个答案:

答案 0 :(得分:41)

您必须列出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(),
)

提到here

  

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

答案 1 :(得分:6)

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

find_packages有两个可选参数:

  1. where默认为'.',即你的curdir。
  2. exclude要排除的内容列表
  3. 我通常在我的仓库中进行测试,所以我使用:

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

答案 2 :(得分:0)

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

相关问题