Import语句适用于PyCharm,但不适用于终端

Pib*_*orn 24 python python-import importerror pycharm

Pycharm 2016.2.3,Mac OS X 10.11.1,Python 3.5(Homebrew);

我有这个文件夹结构

project
  /somepackage
    /subpackage
     __init__.py   
     bar.py
   __init__.py
   foo.py

foo.py:
import somepackage.subpackage.bar
print("foo")

bar.py:
print("bar")
Run Code Online (Sandbox Code Playgroud)

所以我的预期输出是

bar
foo
Run Code Online (Sandbox Code Playgroud)

这从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'
Run Code Online (Sandbox Code Playgroud)

我发现了这个问题,这是同一个问题.但是,没有一个建议的解决方案适合我,因为我确实使用与PyCharm相同的Python解释器,我目前在包含该somepackage/文件夹的文件夹中.

有没有人对如何解决这个问题有任何其他建议?非常感谢你!

Art*_*cca 29

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

python3 -m somepackage.foo
Run Code Online (Sandbox Code Playgroud)

对于记录,另一种选择是编辑您的路径,如:

export PYTHONPATH=.
Run Code Online (Sandbox Code Playgroud)

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

  • @alex它位于[命令行和环境文档](https://docs.python.org/3/using/cmdline.html)中,但除非您已经知道解决方案,否则看起来并不明显!遗憾的是,它没有在教程的[模块部分](https://docs.python.org/3/tutorial/modules.html)中提及,甚至高技术性的[导入系统参考文档](https:/ /docs.python.org/3/reference/import.html). (2认同)

Osc*_*car 6

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

  1. 第一步进入项目的根目录并设置:
export PYTHONPATH=$PATHONPATH:`pwd`
Run Code Online (Sandbox Code Playgroud)
  1. 第二步运行python3 -m somepackage.foo 记住不带“.py”后缀


小智 5

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

PYTHONPATH=${PROJ_DIR}:${PYTHONPATH}
Run Code Online (Sandbox Code Playgroud)

当您在运行/调试配置中选中“将内容根添加到 PYTHONPATH”时,这基本上就是 PyCharm 所做的。这是一个有用的设置,但它破坏了您,因为您的代码在 PyCharm 之外失败。

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

export PYTHONPATH=...
Run Code Online (Sandbox Code Playgroud)

我花了几天的时间来解决所有这些问题。