导入语句适用于 PyCharm 但不适用于终端

Import statement works on PyCharm but not from terminal

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,也是同样的问题。但是,none 的建议解决方案对我有用,因为我确实使用与 PyCharm 相同的 Python 解释器,而且我目前位于包含 /somepackage 的文件夹中文件夹。

有没有人对如何解决这个问题有任何其他建议?

你 运行宁 foo.py 像一个脚本,但你真的像一个模块一样使用它。所以正确的解决方案是 运行 它作为一个模块:

python3 -m somepackage.foo

郑重声明,另一种选择是像这样编辑您的路径:

export PYTHONPATH=.

(或者你可以把绝对目录放在那里,当然你应该附加任何其他已经在你的 PYTHONPATH 中的目录。)这更接近 PyCharm 所做的,但在哲学上不太正确.

我在 Linux 上通过两个步骤解决了我的问题:

  1. 第一步 转到项目的根目录并设置:
export PYTHONPATH=$PATHONPATH:`pwd`
  1. 第二步 运行 python3 -m somepackage.foo 记得没有'.py'后缀

如上所述,设置 PYTHONPATH 使其正常工作。我使用以下 VSCODE .env 内容,以便它适用于任何项目:

PYTHONPATH=${PROJ_DIR}:${PYTHONPATH}

当您在 run/debug 配置中选中“将内容根目录添加到 PYTHONPATH”时,这实际上就是 PyCharm 所做的。这是一个有用的设置,但它会宠坏你,因为你的代码在 PyCharm.

之外失败了

或者,如果您在终端中 运行,首先导出:

export PYTHONPATH=...

我花了好几天时间才搞定。

我在使用 scapy.layers.http 模块时遇到了同样的问题, 这个问题发生在我的 Kali (linux-Debian) 上,但 运行 在 Win-10 上很好(经过一些修改。)

数据包已正确安装 (scapy-http),程序在 PyCharm 中 运行ning 但不是脚本(来自终端)

我尝试通过在主根中重新安装来解决它,并弄乱 sys.path 但 None 已经奏效了。

疑难解答和解决方案

  1. 我发现它在寻找 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)

  1. 然后我检查了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/
    

就是这样 :)!

我知道它有点 故障 但它有效!