簡體   English   中英

setup.py之后的Python ImportError

[英]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 installroot身份安裝cookies並執行cookies ImportError: No module named b出現以下錯誤: ImportError: No module named b 我該如何解決這個問題。

我要做的是在各處使用絕對導入(從Epipy導入...)。 這就是PEP 328中要求的內容

如果未安裝項目,則您的導入將不再起作用。 您可以將項目目錄添加到PYTHONPATH中,安裝軟件包,或者在開發軟件包的過程中使用“ editable”選項 pip install -epip 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM