我有一个包含两个包的项目:
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; (虽然它可以运行),终端可以工作......
答案 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
脚本,将package1
和package2
作为包添加为script1.py
作为脚本,他们将安装在正确的目录中,以便您可以从任何地方导入package1
和package2
,并从任何地方运行script1.py
。