【问题标题】:Python ImportError after setup.pysetup.py 后的 Python ImportError
【发布时间】:2016-01-08 20:26:05
【问题描述】:

使用setup.py 安装我的python 项目并在终端中执行它后,我收到以下错误:

...
from ui.mainwindow import MainWindow
  File "/usr/local/lib/python2.7/dist-packages/EpiPy-0.1-py2.7.egg/epipy/ui/mainwindow.py", line 9, in <module>
    from model.sir import SIR
ImportError: No module named model.sir

...

我们假设我们的项目cookies具有以下结构:

.
├── setup.py
└── src
    ├── a
    │   ├── aa.py
    │   └── __init__.py
    ├── b
    │   ├── bb.py
    │   └── __init__.py
    ├── __init__.py
    └── main.py

文件:cookies/src/main.py

from a import aa

def main():
    print aa.get_aa()

文件cookies/src/a/aa.py

from b import bb

def get_aa():
    return bb.get_bb()

文件:cookies/src/b/bb.py

def get_bb():
    return 'bb'

文件:cookies/setup.py

#!/usr/bin/env python

import os
import sys

try:
    from setuptools import setup, find_packages
except ImportError:
    raise ImportError("Install setup tools")

setup(
    name = "cookies",
    version = "0.1",
    author = "sam",
    description = ("test"),
    license = "MIT",
    keywords = "test",
    url = "asd@ads.asd",
    packages=find_packages(),
    classifiers=[
    """\
    Development Status :: 3 - Alpha
    Operating System :: Unix
    """
    ],
    entry_points = {'console_scripts': ['cookies = src.main:main',],},
)

如果我将cookies 安装为root$ python setup.py install 并执行cookies,我会收到以下错误:ImportError: No module named b。我该如何解决这个问题。

【问题讨论】:

  • 您要导入的包(或其父目录)是否在 PYTHONPATH 中?
  • 不,只有['', '/usr/local/lib/python2.7/dist-packages/EpiPy-0.1-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/peppercorn-0.5-py2.7.egg', ...]。 EpiPy-0.1-py2.7.egg 文件夹包含以下包:EGG-INFOepipy `
  • docs.python.org/2.5/whatsnew/pep-328.html你必须使用from .model.sir import SIR
  • @JBChouinard 这是错误:Traceback (most recent call last): File "main.py", line 5, in &lt;module&gt; from ui.mainwindow import MainWindow File "/home/sam/Documents/workspace/EpiPy/epipy/ui/__init__.py", line 4, in &lt;module&gt; from mainwindow import MainWindow File "/home/sam/Documents/workspace/EpiPy/epipy/ui/mainwindow.py", line 9, in &lt;module&gt; from .model.sir import SIR ImportError: No module named model.sir
  • 哦,是的,如果您在模型子包中,.model 可以工作。由于您在 ui 中,因此您必须使用 ..model (两个点)。它就像 Unix 相对路径一样工作。不过,推荐的用法是在任何地方使用绝对导入。

标签: python pip python-import easy-install


【解决方案1】:

我要做的是在任何地方使用绝对导入(从 Epipy 导入 ...)。这就是PEP 328 中推荐的内容。

如果未安装项目,您的导入将不再起作用。你可以将项目目录添加到你的 PYTHONPATH 中,安装包,或者,当我在开发包的过程中,install with the 'editable' optionpip install -e

在可编辑模式下,不是在您的 python 发行版中安装包代码,而是创建一个指向您的项目的指针。这样它是可导入的,但包使用开发中的实时代码。

例子:

我正在 /home/jbchouinard/mypackage 中开发一个包。在我的代码中,我使用绝对导入,例如from mypackage import subpackage.

如果我使用pip install 安装,该软件包将安装在我的发行版中,比如说在/usr/lib/python2.7/dist-packages 中。如果我对包进行进一步更改,我必须升级或卸载/重新安装包。这很快就会变得乏味。

如果我使用pip install -e 安装,则会在 /usr/lib/python2.7/dist-packages 中创建指向 /home/jbchouinard/mypackage 的指针(.pth 文件)。我可以import mypackage 就好像正常安装一样,但是使用的代码是/home/jbchouinard/mypackage 处的代码;任何更改都会立即反映出来。

【讨论】:

  • 谢谢,您的笔记pip install -e 非常有帮助。现在我使用导入结构package.subpackage.module -> epipy.model.sir
【解决方案2】:

我的一个项目也遇到了类似的问题。 我已经能够通过在我的模块的开头添加这一行来解决我的问题(在除了 sys 和 os 之外的所有导入之前,这是插入所必需的),因此它将包含父文件夹,并且它将是能够看到父文件夹(原来它默认不这样做):

import sys
import os
sys.path.insert(1, os.path.join(sys.path[0], '..'))
# all other imports go here...

这样,您的 main.py 将包含父文件夹(epipy)。 试试看,希望对你有帮助:-)

【讨论】:

  • start of my module 是什么意思,epipy/__init__.py 是什么意思?
  • 我的意思是在文件的顶部,在所有其他导入之前。我已经更新了我的答案以使其更清楚。
猜你喜欢
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 2023-03-18
  • 2020-08-02
  • 2017-09-30
相关资源
最近更新 更多