Python Import语句在PyCharm上工作,但不在terminal上工作
Pycharm 2016.2.3、Mac OS X 10.11.1、Python 3.5(自制) 我有这个文件夹结构Python Import语句在PyCharm上工作,但不在terminal上工作,python,pycharm,python-import,importerror,Python,Pycharm,Python Import,Importerror,Pycharm 2016.2.3、Mac OS X 10.11.1、Python 3.5(自制) 我有这个文件夹结构 project /somepackage /subpackage __init__.py bar.py __init__.py foo.py foo.py: import somepackage.subpackage.bar print("foo") bar.py: print("bar") 所以我的预期输出是 bar fo
project
/somepackage
/subpackage
__init__.py
bar.py
__init__.py
foo.py
foo.py:
import somepackage.subpackage.bar
print("foo")
bar.py:
print("bar")
所以我的预期输出是
bar
foo
当从PyCharm运行时,此功能运行良好。然而,当我从终端运行它时,我得到一个提示:
$ pwd
$ /home/project (not the actual path; just omitting some personal stuff)
$ python3.5 somepackage/foo.py
File "foo.py", line 1, in <module>
import somepackage.subpackage.bar
ImportError: No module named 'somepackage'
from scapy.layers import http --->
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name 'http' from 'scapy.layers' (/usr/local/lib/python3.7/dist-packages/scapy/layers/__init__.py)
$pwd
$/home/project(不是实际路径;只是省略了一些个人信息)
$python3.5 somepackage/foo.py
文件“foo.py”,第1行,在
导入somepackage.subpackage.bar
ImportError:没有名为“somepackage”的模块
我发现,这是关于相同的问题。但是,建议的解决方案对我都不起作用,因为我确实使用了与PyCharm相同的Python解释器,而且我目前在包含somepackage/
文件夹的文件夹中
有没有人对如何解决这个问题有其他建议?谢谢你 您像脚本一样运行foo.py,但实际上您像模块一样使用它。因此,正确的解决方案是将其作为模块运行:
python3 -m somepackage.foo
对于记录,另一种选择是编辑路径,如:
export PYTHONPATH=.
(或者你可以把绝对目录放在那里,当然你应该附加已经在PYTHONPATH中的任何其他目录。)这更接近PyCharm的功能,但在哲学上不太正确。我在Linux上通过两个步骤解决了我的问题:
如上所述,设置PYTHONPATH是它工作的原因。我使用以下VSCODE.env内容,以便它适用于任何项目:
PYTHONPATH=${PROJ_DIR}:${PYTHONPATH}
当您在运行/调试配置中选中“将内容根添加到PYTHONPATH”时,PyCharm基本上就是这么做的。这是一个有帮助的设置,但它会破坏您,因为您的代码在PyCharm之外失败
或者,如果在终端中运行,则首先导出:
export PYTHONPATH=...
我花了好几天的时间来解决这些问题。我只是在使用scapy.layers.http模块时遇到了同样的问题, 这个问题发生在我的Kali(linux Debian)上,但在Win-10上运行良好(经过几次修改) 数据包已正确安装(scapy http),程序正在PyCharm中运行,但未作为脚本(从终端)运行。 我试着通过在主根目录中重新安装来解决这个问题,并弄乱了sys.path,但都没有成功 故障诊断与解决方案
$ pwd
$ /home/project (not the actual path; just omitting some personal stuff)
$ python3.5 somepackage/foo.py
File "foo.py", line 1, in <module>
import somepackage.subpackage.bar
ImportError: No module named 'somepackage'
from scapy.layers import http --->
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: cannot import name 'http' from 'scapy.layers' (/usr/local/lib/python3.7/dist-packages/scapy/layers/__init__.py)
就这样:)
我知道这有点小毛病,但它奏效了 您的软件包是否有
\uuuu init\uuuu.py
文件?这向python表明它是packageYes。我会修改我的问题,谢谢!方法1对我有效。这是哪里记录的?@alex它在文档中,但除非你已经知道解决方案,否则看不到它!遗憾的是,在中甚至高度技术性的文章中都没有提到它。@Arthurtaca Yep,果然:当使用-m模块名调用时,给定模块位于Python模块路径上,并作为脚本执行。
。但愿我能投两次票;)这管用!但是如何使用python3 somepackage/foo.py
,将somepackage/foo.py作为脚本执行?@Kaushal28编辑你的PYTHONPATH
,正如我在回答的开头部分中所说的“为了记录,另一种选择…”