【发布时间】: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 sys和print(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(或其他任何人),您是否对这是为什么有任何见解?
-
你也应该在 Win 中
print(sys.path)。您确定您在两个 OS 上都遵循了相同的步骤吗?请注意,Win 和 Ux 之间的 Python 路径存在一些细微差别。此外,VEnv 可能与它有关。
标签: python ubuntu virtualenv python-3.6