导入语句适用于 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

SQL 插入适用于 Oracle SQL Developer,但不适用于 python

Tailwind CSS 不适用于 Next JS 12,但适用于 Next JS 11