繁体   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