![](/img/trans.png)
[英]ImportError: No module... After python setup.py install
[英]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',],},
)
如果我使用$ python setup.py install
以root
身份安裝cookies
並執行cookies
ImportError: No module named b
出現以下錯誤: ImportError: No module named b
。 我該如何解決這個問題。
我要做的是在各處使用絕對導入(從Epipy導入...)。 這就是PEP 328中要求的內容 。
如果未安裝項目,則您的導入將不再起作用。 您可以將項目目錄添加到PYTHONPATH中,安裝軟件包,或者在開發軟件包的過程中使用“ editable”選項 pip install -e
: pip install -e
在可編輯模式下,將創建指向項目的指針,而不是在python發行版中安裝程序包代碼。 這樣,它就可以導入,但是該包在開發中使用了實時代碼。
例:
我正在/ home / jbchouinard / mypackage中開發一個軟件包。 在我的代碼內部,我使用絕對導入,例如from mypackage import subpackage
。
如果我使用pip install
,則該軟件包將安裝在我的發行版中,比方說在/usr/lib/python2.7/dist-packages中。 如果我對該軟件包進行了進一步更改,則必須升級或卸載/重新安裝該軟件包。 這會很快變得乏味。
如果我使用pip install -e
進行pip install -e
,則會在/usr/lib/python2.7/dist-packages中創建一個指向/ home / jbchouinard / mypackage的指針(.pth文件)。 我可以像import mypackage
一樣正常import mypackage
它,但是使用的代碼是/ home / jbchouinard / mypackage中的代碼; 任何更改都會立即反映出來。
我的一個項目遇到類似的問題。 我已經能夠通過在模塊的開頭添加此行來解決我的問題(在此之前,除了sys&os之前,所有導入均需要此插入),這樣它將包括父文件夾,並且能夠看到父文件夾(結果是默認情況下它不這樣做):
import sys
import os
sys.path.insert(1, os.path.join(sys.path[0], '..'))
# all other imports go here...
這樣,您的main.py將包含父文件夾(epipy)。 嘗試一下,希望對您有所幫助:-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.