【问题标题】:Import statement works on PyCharm but not from terminal导入语句适用于 PyCharm,但不适用于终端
【发布时间】: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 文件夹的文件夹中。

关于如何解决这个问题,有人有其他建议吗?

【问题讨论】:

    标签: python pycharm python-import importerror


    【解决方案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 上通过两个步骤解决了我的问题:

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

      【讨论】:

        【解决方案4】:

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

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

        我尝试通过在主根目录中重新安装并弄乱 sys.path 来解决它,但没有任何工作。

        疑难解答和解决方案

        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/
          

        就是这样:)!

        我知道它有点小故障,但它奏效了!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-02-21
          • 1970-01-01
          • 1970-01-01
          • 2017-08-20
          • 2015-01-21
          • 1970-01-01
          • 1970-01-01
          • 2020-08-03
          相关资源
          最近更新 更多