2017-09-06 89 views
0

我對Python比較陌生,已經開發了我公司的自動化框架。當我嘗試通過解釋器運行我的Python腳本時,爲什麼會出現「ImportError:No module named」?

在開發過程中,我第一次遇到了需要同時運行多個測試的情況。直到現在,我總是使用Eclipse,不僅開發我的框架,而且還運行測試(當然,它一次只有一個)。 當我試圖通過CMD屏幕「python」運行我的一個測試(我設法通過Eclipse運行的一個測試)時,它甚至沒有開始運行,我得到的結果是「ImportError:No module named」(有關到我從開發的軟件包中進口的產品)。

Eclipse如何設法與我所有的Imports相處並運行我的測試,而python解釋器不能?

爲了通過解釋器來運行我的測試,我需要做些什麼?

編輯

下面舉例說明什麼,我爲了試圖導入我的私有模塊

C:\Users\alpha_2.PL\workspace\PacketLight Automation\Test_Cases>python 
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 
64 bit (AM D64)] on win32 Type "help", "copyright", "credits" or 
"license" for more information. 
>>> from Utilities.Browser_Utils import Open_Browser Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: 
No module named 'Utilities' 
>>> quit() 

C:\Users\alpha_2.PL\workspace\PacketLight Automation\Test_Cases>cd.. 

C:\Users\alpha_2.PL\workspace\PacketLight Automation>cd Utilities 

C:\Users\alpha_2.PL\workspace\PacketLight Automation\Utilities>python 
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 
64 bit (AM D64)] on win32 Type "help", "copyright", "credits" or 
"license" for more information. 
>>> from Utilities.Browser_Utils import Open_Browser Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: 
No module named 'Utilities' 
>>> quit() 

C:\Users\alpha_2.PL\workspace\PacketLight Automation\Utilities>dir 
Volume in drive C has no label. Volume Serial Number is 1E0C-6554 

    Directory of C:\Users\alpha_2.PL\workspace\PacketLight Automation\Utilities 

08/07/2017 03:05 PM <DIR>   . 
08/07/2017 03:05 PM <DIR>   .. 
08/10/2017 10:28 AM    455 Browser_Utils.py 
09/05/2017 05:00 PM    7,007 General_Utils.py 
07/31/2017 01:49 PM     0 __init__.py 
09/05/2017 06:07 PM <DIR>   __pycache__ 
       3 File(s)   7,462 bytes 
       3 Dir(s) 394,707,480,576 bytes free 

C:\Users\alpha_2.PL\workspace\PacketLight Automation\Utilities>python 
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 
64 bit (AM D64)] on win32 Type "help", "copyright", "credits" or 
"license" for more information. 
>>> from Utilities.Browser_Utils import Open_Browser 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> ImportError: 
No module named 'Utilities' 
>>> 
+0

使用python3,而不是蟒蛇的人。否則你必須使用pip3來安裝所有的python3軟件包。 –

+1

看起來您需要閱讀一些有關Python環境的文章 - 對於學習在IDE中使用該語言的人來說,這幾乎是不合適的。您可能會發現Eclipse會特別努力管理PYTHONPATH環境變量。 – holdenweb

+0

@rabbit_mq什麼是python3?你爲什麼認爲它可以解決我的問題? –

回答

1

我終於設法解決了這個問題。當這裏的一些答案指向PYTHONPATH時,我誤解了PATH(環境變量),因此沒有通過編輯sys.path來解決我的問題。

當我意識到我需要自己創建PYTHONPATH並添加自己的路徑時,我設法導入了我的包。

感謝所有誰在你的命令回答沒有你,我沒有對這個問題的任何解決方案方向

2

所有我可以想像的是,Eclipse的會從項目目錄,運行命令,使相關的進口工作。

如果我在/ home/jpic中運行python,並且存在foo.py,那麼我可以import foo。但是,如果我在/ home中運行python,那麼import foo將會失敗。因此,請確保在調用python之前將cd放入正確的目錄中。

如果我想讓foo可以從任何地方導入,我將不得不把它做成一個python包,這可能不是你想要對你的項目做的事情(但是我會和我所有的項目一起,因爲它很酷有進口到處工作^^)。

如果你想調試進口,運行python-vv,你會得到進口調試輸出這樣:

# trying /home/jpic/foo.cpython-36m-x86_64-linux-gnu.so 
# trying /home/jpic/foo.abi3.so 
# trying /home/jpic/foo.so 
# trying /home/jpic/foo.py 
# trying /home/jpic/foo.pyc 
# trying /usr/lib/python3.6/foo.cpython-36m-x86_64-linux-gnu.so 
# trying /usr/lib/python3.6/foo.abi3.so 
# trying /usr/lib/python3.6/foo.so 
# trying /usr/lib/python3.6/foo.py 
# trying /usr/lib/python3.6/foo.pyc 
# trying /usr/lib/python3.6/lib-dynload/foo.cpython-36m-x86_64-linux-gnu.so 
# trying /usr/lib/python3.6/lib-dynload/foo.abi3.so 
# trying /usr/lib/python3.6/lib-dynload/foo.so 
# trying /usr/lib/python3.6/lib-dynload/foo.py 
# trying /usr/lib/python3.6/lib-dynload/foo.pyc 
# trying /home/jpic/.local/lib/python3.6/site-packages/foo.cpython-36m-x86_64-linux-gnu.so 
# trying /home/jpic/.local/lib/python3.6/site-packages/foo.abi3.so 
# trying /home/jpic/.local/lib/python3.6/site-packages/foo.so 
# trying /home/jpic/.local/lib/python3.6/site-packages/foo.py 
# trying /home/jpic/.local/lib/python3.6/site-packages/foo.pyc 
# trying /home/jpic/src/django-cities-light/foo.cpython-36m-x86_64-linux-gnu.so 
# trying /home/jpic/src/django-cities-light/foo.abi3.so 
# trying /home/jpic/src/django-cities-light/foo.so 
# trying /home/jpic/src/django-cities-light/foo.py 
# trying /home/jpic/src/django-cities-light/foo.pyc 
# trying /home/jpic/src/django-autocomplete-light/src/foo.cpython-36m-x86_64-linux-gnu.so 
# trying /home/jpic/src/django-autocomplete-light/src/foo.abi3.so 
# trying /home/jpic/src/django-autocomplete-light/src/foo.so 
# trying /home/jpic/src/django-autocomplete-light/src/foo.py 
# trying /home/jpic/src/django-autocomplete-light/src/foo.pyc 
# trying /home/jpic/src/django-autocomplete-light/test_project/src/genericm2m/foo.cpython-36m-x86_64-linux-gnu.so 
# trying /home/jpic/src/django-autocomplete-light/test_project/src/genericm2m/foo.abi3.so 
# trying /home/jpic/src/django-autocomplete-light/test_project/src/genericm2m/foo.so 
# trying /home/jpic/src/django-autocomplete-light/test_project/src/genericm2m/foo.py 
# trying /home/jpic/src/django-autocomplete-light/test_project/src/genericm2m/foo.pyc 
# trying /home/jpic/work/mez/src/foo.cpython-36m-x86_64-linux-gnu.so 
# trying /home/jpic/work/mez/src/foo.abi3.so 
# trying /home/jpic/work/mez/src/foo.so 
# trying /home/jpic/work/mez/src/foo.py 
# trying /home/jpic/work/mez/src/foo.pyc 
# trying /usr/lib/python3.6/site-packages/foo.cpython-36m-x86_64-linux-gnu.so 
# trying /usr/lib/python3.6/site-packages/foo.abi3.so 
# trying /usr/lib/python3.6/site-packages/foo.so 
# trying /usr/lib/python3.6/site-packages/foo.py 
# trying /usr/lib/python3.6/site-packages/foo.pyc 
# trying /usr/lib/python3.6/site-packages/gtk-2.0/foo.cpython-36m-x86_64-linux-gnu.so 
# trying /usr/lib/python3.6/site-packages/gtk-2.0/foo.abi3.so 
# trying /usr/lib/python3.6/site-packages/gtk-2.0/foo.so 
# trying /usr/lib/python3.6/site-packages/gtk-2.0/foo.py 
# trying /usr/lib/python3.6/site-packages/gtk-2.0/foo.pyc 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<frozen importlib._bootstrap>", line 961, in _find_and_load 
    File "<frozen importlib._bootstrap>", line 948, in _find_and_load_unlocked 
ModuleNotFoundError: No module named 'foo' 

注意上面的調試輸出在標準錯誤,而不是標準輸入取得。這意味着你應該使用&>而不是>將其重定向到文件,在bash4或2>上的windows 我認爲,在讀their docs後。

我不知道日食,所以我無法談論它的作用,但這個訣竅應該給你足夠的反饋,從口譯員破解你自己的解決方案。

另一種可能性是Eclipse使用Python3,並且您在CLI中使用Python2。在這種情況下,您需要在模塊目錄中添加__init__.py文件,或者確保您的CLI是python 3,請使用python --version進行檢查。示例:

07/09 2017 12:03:11 [email protected] /tmp 
$ mkdir foo 

07/09 2017 12:03:13 [email protected] /tmp 
$ touch foo/bar.py 

07/09 2017 12:03:16 [email protected] /tmp 
$ python3 
Python 3.6.2 (default, Jul 20 2017, 03:52:27) 
[GCC 7.1.1 20170630] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import foo.bar 
>>> 

07/09 2017 12:03:20 [email protected] /tmp 
$ python2 
Python 2.7.13 (default, Jul 21 2017, 03:24:34) 
[GCC 7.1.1 20170630] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import foo.bar 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named foo.bar 
>>> 

07/09 2017 12:03:28 [email protected] /tmp 
$ touch foo/__init__.py 

07/09 2017 12:03:33 [email protected] /tmp 
$ python2 
Python 2.7.13 (default, Jul 21 2017, 03:24:34) 
[GCC 7.1.1 20170630] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import foo.bar 
+0

我試過了你的建議但是沒有打印將結果輸出到帶有「>」的文件。所以,我不能真正使用它進​​行調試,因爲列表比CMD緩衝區大。順便說一下,我已經開始使用「print(sys.path)」進行調試,並且顯示了包含哪些路徑。糾正我,如果我錯了,但我明白,如果我的路徑沒有找到那裏比Python沒有理由能夠解釋我導入的專有模塊 –

+0

這是因爲它是輸出到標準錯誤,而不是標準輸出。如果在bash 4上,請嘗試'&>'而不是'>'。另外,sys.path在這裏以'['',...]''開頭,我想這代表了當前的工作目錄,我在回答開始的時候談到了,你明白了嗎? – jpic

+0

順便說一句,做完上述之後,我嘗試將我的所有項目(及其所有包)複製到在sys.path中找到的路徑之一,然後嘗試運行我的一個腳本。這也導致了「ImportError:No module named」 –

0

您不應該依賴IDE來使模塊可導入。

當使用虛擬環境(或者,在您自己的危險中,使用sudo在系統Python中安裝)時,使用pip實用程序安裝正確打包的軟件很容易。

,直到你學會如何做那些,注意PYTHONPATH環境變量應該是一個分號(Windows)或冒號(UNIX)分隔的目錄,它們各自在翻譯的啓動時間將被預置到sys.path的列表。因此,您可以確保您的軟件(即使不是可安裝的)可供使用。

+0

我添加了工具包(從上面的例子)到sys.path的路徑(通過使用「sys.path.append()」),當我嘗試運行「從Utilities.Browser_Utils導入時仍然出現同樣的錯誤Open_Browser「。可能是什麼問題? –

+0

我想爲這個問題創建一個[MCVE](https://stackoverflow.com/help/mcve)。在制定它的過程中,你可能會發現你做錯了。 – holdenweb

+0

如果我會說tha我想從頭開始。在我安裝Python之後,下一步就是編寫新的包和模塊。在這種情況下,我需要放置我的包以便根本不需要觸摸sys.path?如果我想創建我的包並將它們放在任何我想要的地方,該怎麼辦?我在哪裏可以放我的軟件包,然後我需要寫入sys.path? –

相關問題