为什么当我尝试通过解释器运行我的 Python 脚本时"ImportError: No module named"?



我对Python比较陌生,并且已经在我公司开发自动化框架。

在开发过程中,我第一次遇到了需要同时运行多个测试的情况。到目前为止,我一直使用 Eclipse,不仅用于开发我的框架,还运行测试(当然一次只能运行一个)。 当我尝试通过CMD屏幕"python"运行我的一个测试(我设法通过Eclipse运行的一个测试)时,它甚至没有开始运行,我得到的结果是"导入错误:没有命名的模块"(与我从我开发的包中进行的导入有关)。

Eclipse 如何设法与我所有的导入相处并运行我的测试,而 python 解释器却不能?

我需要做什么才能通过解释器运行我的测试?

编辑

以下是我为了导入我的专有模块而尝试的示例

C:Usersalpha_2.PLworkspacePacketLight AutomationTest_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:Usersalpha_2.PLworkspacePacketLight AutomationTest_Cases>cd..
C:Usersalpha_2.PLworkspacePacketLight Automation>cd Utilities
C:Usersalpha_2.PLworkspacePacketLight AutomationUtilities>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:Usersalpha_2.PLworkspacePacketLight AutomationUtilities>dir 
Volume in drive C has no label.  Volume Serial Number is 1E0C-6554
Directory of C:Usersalpha_2.PLworkspacePacketLight AutomationUtilities
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:Usersalpha_2.PLworkspacePacketLight AutomationUtilities>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'
>>>

我所能想象的是 Eclipse 会从项目目录运行你的命令,这使得相对导入起作用。

如果我在/home/jpic 中运行 python,并且那里存在 foo.py,那么我可以import foo.但是,如果我在/home 中运行 python,那么import foo会失败。因此,请确保在调用python之前cd到正确的目录。

如果我想让foo可以从任何地方导入,我必须把它做成一个python包,这可能不是你想在你的项目中做的事情(但我会,在我的所有项目中,因为让导入在任何地方工作很酷^^)。

如果要调试导入,请使用-vv运行python,您将获得导入调试输出,如下所示:

# 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 上的文件。

我不知道 eclipse,所以我无法谈论它的作用,但这个技巧应该会给你足够的解释器反馈来破解你自己的解决方案。

另一种可能性是 Eclipse 使用 Python3,而您在 CLI 中使用 Python2。在这种情况下,您需要在模块目录中添加__init__.py文件,或者更确切地说,确保您的 CLI 是 python 3,请检查python --version。例:

07/09 2017 12:03:11 jpic@mez /tmp 
$ mkdir foo
07/09 2017 12:03:13 jpic@mez /tmp 
$ touch foo/bar.py
07/09 2017 12:03:16 jpic@mez /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 jpic@mez /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 jpic@mez /tmp 
$ touch foo/__init__.py
07/09 2017 12:03:33 jpic@mez /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

我终于设法解决了这个问题。当这里的一些答案指向PYTHONPATH时,我用PATH(环境变量)误解了它,因此不能通过仅编辑sys.path来解决我的问题。

当我意识到我需要自己创建 PYTHONPATH 并添加自己的路径时,我设法导入了我的包。

感谢所有在没有你的情况下回答的人,我对这个问题的解决方案没有任何方向

不应依赖 IDE 来使模块可导入。

使用虚拟环境时(或者,自担风险,使用sudo在系统Python中安装),使用pip实用程序可以轻松安装正确打包的软件。

在了解如何执行这些操作之前,请注意,PYTHONPATH环境变量应该是分号 (Windows) 或冒号 (Unix) 分隔的目录列表,每个目录都预置在解释器启动时sys.path。因此,您可以确保您的软件(即使pip不是可安装

的)也可以使用。

相关内容

最新更新