【问题标题】:Cannot import a module in parent directory无法在父目录中导入模块
【发布时间】:2017-09-01 00:25:20
【问题描述】:

我正在尝试让一个 python 项目在 Ubuntu 17 中运行,但我在加载模块时遇到了问题。我已经能够通过一个简单的例子来隔离问题。此示例适用于 Windows 10,但不适用于 Ubuntu。我们将不胜感激帮助使其工作!

以下是我正在遵循的步骤:

首先我在 ~/dev 中创建一个名为 code_playground 的项目目录。接下来我为这个项目创建一个 virtualenv:

~/dev$ which virtualenv
/usr/local/bin/virtualenv

~/dev$ virtualenv -p python3.6 code_playground/
Running virtualenv with interpreter /usr/bin/python3.6
Using base prefix '/usr'
New python executable in /home/user/dev/code_playground/bin/python3.6
Also creating executable in /home/user/dev/code_playground/bin/python
Installing setuptools, pip, wheel...done.

我激活虚拟环境:

~/dev/code_playground$ source ./bin/activate
(code_playground) ~/dev/code_playground$ 

它似乎有效:

(code_playground) ~/dev/code_playground$ which python
/home/user/dev/code_playground/bin/python

我创建了一个名为 mod_a.py 的文件,其中包含一个简单的函数:

def print_name(name):
    print('Your name is {0}'.format(name))

现在我创建一个名为 sub 的子目录:

(code playground) ~/dev/code_playground$ mkdir sub
(code playground) ~/dev/code_playground$ cd sub
(code playground) ~/dev/code_playground/sub$ 

在 sub 中,我创建了一个名为 mod_b.py 的文件,其中包含以下内容:

from mod_a import print_name

print_name('Joe')

我尝试运行 mod_b.py,但出现错误:

(code playground) ~/dev/code_playground/sub$ python mod_b.py 
Traceback (most recent call last):
   File "mod_b.py", line 1, in <module>
      from mod_a import print_name
ImportError: No module named mod_a

【问题讨论】:

  • 在脚本开头添加import sysprint(sys.path)...并检查路径。但是,在启动 python 之前,您很可能必须 export PYTHONPATH=~/dev/code_playground:${PYTHONPATH}
  • 谢谢@CrisiFati。这确实解决了问题。我想知道,您是否对为什么在 Linux 中需要它而在 Windows 中没有它有任何见解?在 virtualenv 之后,但在设置 PYTHONPATH 变量之前,这是我从 mod_b.py 得到的 sys.path:['/home/user/dev/code_playground/sub', '/home/user/dev/code_playground/lib/python36.zip', '/home/user/dev/code_playground/lib/python3.6', '/home/user/dev/code_playground/lib/python3.6/lib-dynload', '/usr/lib/python3.6', '/home/user/dev/code_playground/lib/python3.6/site-packages']
  • 我刚刚注意到,在Windows中,code_playground目录在运行virtualenv后包含在sys.path中,无需设置PYTHONPATH。但是,在 Linux 中并非如此。我想这就是它在 Windows 中工作的原因。 @CristiFati(或其他任何人),您是否对这是为什么有任何见解?
  • 你也应该在 Winprint(sys.path)。您确定您在两个 OS 上都遵循了相同的步骤吗?请注意,WinUx 之间的 Python 路径存在一些细微差别。此外,VEnv 可能与它有关。

标签: python ubuntu virtualenv python-3.6


【解决方案1】:

Python 解释器必须知道在哪里可以找到module_a.py。导入模块module_a.py 的文件位于module_a.py 所在目录的子目录中,这一事实“没有多大帮助”。你可以尝试几件事:

1- 按照@CristiFati 的建议,将您的mod_a.py 路径(在脚本运行之前)添加到您的Python 路径中。

2- 将您的 mod_a.py 路径(使用 Python 代码)添加到您的 Python 路径中,执行类似(讨厌的):

import
sys.path.insert(0, '/home/user/dev/code_playground/bin/python')
from mod_a import print_name
...

3- 评估相对导入 (6.4.2. Intra-package References)

【讨论】:

  • 即使没有virtualenv,这个解决方案实际上也可以工作,如果我们想利用virtualenv而不显式附加父文件夹路径怎么办?例如,像 Pycharm 一样,它会自动使用项目文件夹路径初始化 sys 路径。
猜你喜欢
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多