导入模块不通过终端工作,而它通过IDE工作

时间:2016-09-01 08:40:17

标签: python windows import

我有一个包含两个包的项目:

MyProjectDir
-Package1
--__init__.py
--file1_1.py
--file1_2.py
--file1_3.py
-Package2
--__init__.py
--file2_1.py
--file2_2.py
--file2_3.py

现在,在包中,文件在文件之间有一些导入:

file2_3.py:

from Package2.file2_1 import *
run_some_code()

当我直接从PyCharm运行file2_3.py时,一切运行正常。但是当我尝试在终端中运行脚本时(我正在使用Windows 7):

D:\SVN Repo\MyProjectDir\Package2> python file2_3.py

或者

D:\SVN Repo\MyProjectDir> python ./Package2/file2_3.py

似乎python无法看到我的包,我收到错误:

Traceback (most recent call last):
  File "./Package2/file2_3.py", line 1, in <module>
    from Package2.file2_1 import *
ImportError: No module named 'Package2'

是什么原因?

编辑:如果在导入行中我使用from file2_1.py import *而没有包名,则IDE会将导入强调为&#34;未解析参考包2&#34; (虽然它可以运行),终端可以工作......

1 个答案:

答案 0 :(得分:3)

问题在于你运行程序的方式是错误的,PyCharm知道如何处理python子模块,从而正确执行文件。

如果您的软件包package1包含模块package1.my_module,则应使用-m开关执行此操作:

python -m package1.my_module

直接运行:

python package1/my_module.py   <-- NO! Incorrect

另外:您应该从外部包中运行该文件。所以如果你的项目是:

MyProject
  |
  +- package1
  |   |
  |   +- file1.py
  |
  +- package2
      |
      +- file2.py

您的工作目录应为MyProject

我的个人建议:从不直接运行子模块。而是将代码放在包外的单独的脚本中。所以我有:

MyProject
  |
  +- package1
  |   |
  |   +- file1.py
  |
  +- package2
  |   |
  |   +- file2.py
  |
  +- scripts
      |
      +- script1.py

script1.py导入所需模块的地方:

from package1 import file1
from package2 import file2

# code

然后您可以从MyProject目录运行该脚本:

python scripts/script1.py

当您要部署代码时,您将编写一个setup.py脚本,将package1package2作为包添加为script1.py作为脚本,他们将安装在正确的目录中,以便您可以从任何地方导入package1package2,并从任何地方运行script1.py