2017-09-06 87 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? –

相关问题