簡體   English   中英

python作為腳本運行時導入失敗,但在iPython中卻沒有?

[英]import fails when running python as script, but not in iPython?

我有一個這樣的項目結構:

folder1
       |
       folder2
             |
             tests

我在每個文件夾中都有__init__.py。 當我位於folder1的父目錄中時,我運行iPython並執行

from folder1.folder2.tests.test1 import main
main()

一切正常。 但是當我跑步時

python folder1/folder2/tests/test1.py

我收到ImportError:沒有名為folder1.folder2.file1的模塊,其中test1中的import語句是

from folder1.folder2.file1 import class1

對此感到困惑-我猜這是一個路徑問題,但是我不明白我的代碼出了什么問題(其他文件夾中的許多類似設置),以及為什么它仍然可以在iPython中工作,而不是以python作為腳本運行。

有和沒有腳本文件的模塊搜索路徑python 3 docu )都不同:

交互式python解釋器

(適用於pythonipython

$ python
Python 2.7.3 (default, Dec 18 2014, 19:10:20) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.path)
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/pymodules/python2.7/gtk-2.0', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol']
>>>

注意第一個條目是一個空字符串。 空字符串是等效於的相對路徑. 模塊搜索路徑中的相對路徑相對於解釋器進程的當前工作目錄,因此這只是您調用解釋器的當前工作目錄。 (在您的情況下,這恰好是項目的根。)

執行腳本文件

$ echo 'import sys' > /tmp/pathtest.py
$ echo 'print(sys.path)' >> /tmp/pathtest.py 
$ python /tmp/pathtest.py 
['/tmp', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/pymodules/python2.7/gtk-2.0', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol']

請注意,這里的第一項是包含我們作為參數傳遞的腳本文件的目錄的絕對路徑。

在導入numpy或任何依賴numpy的庫時,我遇到了類似的問題。 問題是我的項目文件夾中的文件名為random.py。

Numpy的隨機功能中包含random.py,但導入時使用的是我項目文件夾中的random.py。

最好的解決方案是不要使用任何庫的標准模塊名稱來命名任何文件。

請享用.. :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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