Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Import语句在PyCharm上工作,但不在terminal上工作_Python_Pycharm_Python Import_Importerror - Fatal编程技术网

Python Import语句在PyCharm上工作,但不在terminal上工作

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

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运行时,此功能运行良好。然而,当我从终端运行它时,我得到一个提示:

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

  • 第一步 转到项目的根目录并设置:
  • 第二步 运行python3-msomepackage.foo 记住没有“.py”后缀

  • 如上所述,设置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,但都没有成功

    故障诊断与解决方案
  • 我发现它在以下位置查找http模块:

    /usr/local/lib/python3.7/dist-packages/scapy/layers/init.py

  • 得到了恐怖的消息:

    $ 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
    ,正如我在回答的开头部分中所说的“为了记录,另一种选择…”