当我尝试通过解释器运行我的Python脚本时,为什么会出现“ImportError:No module named”?
我对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'
>>>
我终于设法解决了这个问题。当这里的一些答案指向PYTHONPATH时,我误解了PATH(环境变量),因此没有通过编辑sys.path来解决我的问题。
当我意识到我需要自己创建PYTHONPATH并添加自己的路径时,我设法导入了我的包。
感谢所有谁在你的命令回答没有你,我没有对这个问题的任何解决方案方向
所有我可以想像的是,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
我试过了你的建议但是没有打印将结果输出到带有“>”的文件。所以,我不能真正使用它进行调试,因为列表比CMD缓冲区大。顺便说一下,我已经开始使用“print(sys.path)”进行调试,并且显示了包含哪些路径。纠正我,如果我错了,但我明白,如果我的路径没有找到那里比Python没有理由能够解释我导入的专有模块 –
这是因为它是输出到标准错误,而不是标准输出。如果在bash 4上,请尝试'&>'而不是'>'。另外,sys.path在这里以'['',...]''开头,我想这代表了当前的工作目录,我在回答开始的时候谈到了,你明白了吗? – jpic
顺便说一句,做完上述之后,我尝试将我的所有项目(及其所有包)复制到在sys.path中找到的路径之一,然后尝试运行我的一个脚本。这也导致了“ImportError:No module named” –
您不应该依赖IDE来使模块可导入。
当使用虚拟环境(或者,在您自己的危险中,使用sudo
在系统Python中安装)时,使用pip
实用程序安装正确打包的软件很容易。
,直到你学会如何做那些,注意PYTHONPATH
环境变量应该是一个分号(Windows)或冒号(UNIX)分隔的目录,它们各自在翻译的启动时间将被预置到sys.path
的列表。因此,您可以确保您的软件(即使不是可安装的)可供使用。
我添加了工具包(从上面的例子)到sys.path的路径(通过使用“sys.path.append()”),当我尝试运行“从Utilities.Browser_Utils导入时仍然出现同样的错误Open_Browser“。可能是什么问题? –
我想为这个问题创建一个[MCVE](https://stackoverflow.com/help/mcve)。在制定它的过程中,你可能会发现你做错了。 – holdenweb
如果我会说tha我想从头开始。在我安装Python之后,下一步就是编写新的包和模块。在这种情况下,我需要放置我的包以便根本不需要触摸sys.path?如果我想创建我的包并将它们放在任何我想要的地方,该怎么办?我在哪里可以放我的软件包,然后我需要写入sys.path? –
使用python3,而不是蟒蛇的人。否则你必须使用pip3来安装所有的python3软件包。 –
看起来您需要阅读一些有关Python环境的文章 - 对于学习在IDE中使用该语言的人来说,这几乎是不合适的。您可能会发现Eclipse会特别努力管理PYTHONPATH环境变量。 – holdenweb
@rabbit_mq什么是python3?你为什么认为它可以解决我的问题? –