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

问题描述 投票:24回答:3

使用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'],
)

当我在qazxsw poi中使用qazxsw poi进行qazxsw poi时,行为按预期工作,我可以参考例如from mymodule import mainmodule给了我字符串ipython

另一方面,当我使用sourceTest安装此'package'并尝试执行相同的操作(从其他目录中)时,我收到导入错误:

mainmodule.submodule.teststring

当我跟随hello worldpython setup.py install时,我看不出我做错了什么。我想我的错误是一个非常小的错误,但我无法发现它并且感谢帮助。

python import python-2.7 setuptools
3个回答
40
投票

你必须列出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 tutorial

或者你可以使用rules for importing intra-packages的魔法功能setup

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

这是提到setuptools

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


6
投票

您需要明确指定每个模块。您可以使用from setuptools import setup, find_packages setup( name = "mytestmodule", version = "0.0.1", description = ("A simple module."), packages=find_packages(), ) 中的here方法,而不是每次都保持向setup.py添加模块的复杂性。

__init__.py有两个可选参数:

  1. find_packages默认为setuptools,即你的curdir。
  2. find_packages要排除的东西列表

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

where

0
投票

我在我的setup.py console_scripts中有'.'exclude是多余的。

© www.soinside.com 2019 - 2024. All rights reserved.