Python setup.py 后导入错误
Python ImportError after setup.py
使用 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
。我该如何解决这个问题。
我的一个项目也遇到了类似的问题。
我已经能够通过在我的模块的开头添加这一行来解决我的问题(在除 sys & os 之外的所有导入之前,这是此插入所必需的),以便它包含父文件夹和它将能够看到父文件夹(事实证明默认情况下它不会这样做):
import sys
import os
sys.path.insert(1, os.path.join(sys.path[0], '..'))
# all other imports go here...
这样,您的 main.py 将包含父文件夹 (epipy)。
试一试,希望这会有所帮助:-)
我会做的是在任何地方都使用绝对导入(from epipy import ...)。这就是 PEP 328.
中推荐的内容
如果未安装该项目,您的导入将不再有效。您可以将项目目录添加到您的 PYTHONPATH,安装包,或者,我在开发包的过程中所做的,install with the 'editable' option:pip install -e
在可编辑模式下,不是在 python 分发中安装包代码,而是创建一个指向您的项目的指针。这样它是可导入的,但包在开发中使用实时代码。
示例:
我正在 /home/jbchouinard/mypackage 中开发一个包。在我的代码中,我使用绝对导入,例如from mypackage import subpackage
.
如果我使用 pip install
安装,该软件包将安装在我的发行版中,比如说 /usr/lib/python2.7/dist-packages。如果我对包进行进一步更改,我必须升级或 uninstall/reinstall 包。这很快就会变得乏味。
如果我使用 pip install -e
安装,则会在 /usr/lib/python2.7/dist-packages 中创建指向 /home/jbchouinard/mypackage 的指针(.pth 文件)。我可以import mypackage
好像正常安装一样,但是使用的代码是/home/jbchouinard/mypackage处的代码;任何更改都会立即反映出来。
使用 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
。我该如何解决这个问题。
我的一个项目也遇到了类似的问题。 我已经能够通过在我的模块的开头添加这一行来解决我的问题(在除 sys & os 之外的所有导入之前,这是此插入所必需的),以便它包含父文件夹和它将能够看到父文件夹(事实证明默认情况下它不会这样做):
import sys
import os
sys.path.insert(1, os.path.join(sys.path[0], '..'))
# all other imports go here...
这样,您的 main.py 将包含父文件夹 (epipy)。 试一试,希望这会有所帮助:-)
我会做的是在任何地方都使用绝对导入(from epipy import ...)。这就是 PEP 328.
中推荐的内容如果未安装该项目,您的导入将不再有效。您可以将项目目录添加到您的 PYTHONPATH,安装包,或者,我在开发包的过程中所做的,install with the 'editable' option:pip install -e
在可编辑模式下,不是在 python 分发中安装包代码,而是创建一个指向您的项目的指针。这样它是可导入的,但包在开发中使用实时代码。
示例:
我正在 /home/jbchouinard/mypackage 中开发一个包。在我的代码中,我使用绝对导入,例如from mypackage import subpackage
.
如果我使用 pip install
安装,该软件包将安装在我的发行版中,比如说 /usr/lib/python2.7/dist-packages。如果我对包进行进一步更改,我必须升级或 uninstall/reinstall 包。这很快就会变得乏味。
如果我使用 pip install -e
安装,则会在 /usr/lib/python2.7/dist-packages 中创建指向 /home/jbchouinard/mypackage 的指针(.pth 文件)。我可以import mypackage
好像正常安装一样,但是使用的代码是/home/jbchouinard/mypackage处的代码;任何更改都会立即反映出来。