导入语句适用于 PyCharm,但不适用于终端
Posted
技术标签:
【中文标题】导入语句适用于 PyCharm,但不适用于终端【英文标题】:Import statement works on PyCharm but not from terminal 【发布时间】:2017-03-11 06:56:45 【问题描述】: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
foo
从 PyCharm 运行时可以正常工作。但是,当我从终端运行它时,我得到一个 ImportError:
$ 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'
我找到了this question,这也是同样的问题。但是,建议的解决方案都不适合我,因为我确实使用与 PyCharm 相同的 Python 解释器,并且我目前位于包含 /somepackage
文件夹的文件夹中。
关于如何解决这个问题,有人有其他建议吗?
【问题讨论】:
【参考方案1】:您像脚本一样运行 foo.py,但您实际上是像模块一样使用它。所以正确的解决方案是将其作为一个模块运行:
python3 -m somepackage.foo
为了记录,另一种选择是编辑您的路径,例如:
export PYTHONPATH=.
(或者你可以把绝对目录放在那里,当然你应该附加任何其他已经在你的 PYTHONPATH 中的目录。)这更接近 PyCharm 所做的,但在哲学上不太正确。
【讨论】:
方法 #1 对我有用。这是在哪里记录的? @alex 它在Command Line and Environment docs 中,但除非您已经知道解决方案,否则看那里并不明显!可惜Modules section of the tutorial,甚至技术含量高的Import System reference docs,都没有提到它。 @ArthurTacca 是的,果然:When called with -m module-name, the given module is located on the Python module path and executed as a script.
。希望我能投票两次;)
这行得通!但是如何使用 python3 somepackage/foo.py
将 somepackage/foo.py 作为脚本执行?
@Kaushal28 编辑您的PYTHONPATH
,正如我在回答的开头部分所说的“为了记录,另一种选择......”【参考方案2】:
如上所述,设置 PYTHONPATH 是它工作的原因。我使用以下 VSCODE .env 内容,以便它适用于任何项目:
PYTHONPATH=$PROJ_DIR:$PYTHONPATH
这本质上是 PyCharm 在运行/调试配置中选中“将内容根添加到 PYTHONPATH”时所做的事情。这是一个有用的设置,但它会破坏你,因为你的代码在 PyCharm 之外失败。
或者,如果你在终端中运行,首先导出:
export PYTHONPATH=...
我花了几天的时间来解决所有这些问题。
【讨论】:
【参考方案3】:我在 Linux 上通过两个步骤解决了我的问题:
-
第一步
进入你项目的根目录并设置:
export PYTHONPATH=$PATHONPATH:`pwd`
-
第二步
运行
python3 -m somepackage.foo
记住没有'.py'后缀
【讨论】:
【参考方案4】:我在使用 scapy.layers.http 模块时遇到了同样的问题, 这个问题发生在我的 Kali (linux-Debian) 上,但在 Win-10 上运行良好(经过几次修改。)
数据包已正确安装(scapy-http)并且程序在 PyCharm 中运行但不是作为脚本(来自终端)
我尝试通过在主根目录中重新安装并弄乱 sys.path 来解决它,但没有任何工作。
疑难解答和解决方案
我发现它在以下位置寻找http模块:
/usr/local/lib/python3.7/dist-packages/scapy/layers/init.py
并得到 ImportError:
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)
然后我检查了scapy-http
的真正安装位置,即名为http.py
的模块,所以我将它复制到:
/usr/local/lib/python3.7/dist-packages/scapy/layers/
found the http.py file in :/usr/local/lib/python3.7/dist-packages/scapy_http/
就是这样:)!
我知道它有点小故障,但它奏效了!
【讨论】:
以上是关于导入语句适用于 PyCharm,但不适用于终端的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 查询适用于 SELECT 但不适用于 UPDATE 语句
Kivy 应用程序适用于 Windows 7,但不适用于 ubuntu
import pymongo 适用于 Python 解释器,但不适用于脚本
sql 脚本适用于 MySQL,但不适用于 google bigquery