2017-09-01 61 views
0

我想要得到一个在Ubuntu 17中工作的python项目,但我在模块加载时遇到了问题。我已经能够用一个微不足道的例子来分析问题。此示例适用于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)) 

现在我创建一个子目录称为子:

(code playground) ~/dev/code_playground$ mkdir sub 
(code playground) ~/dev/code_playground$ cd sub 
(code playground) ~/dev/code_playground/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 
+0

添加'进口sys'和'print(sys.path)'在脚本开始处......并检查路径。但是,在启动_python_之前,很可能必须'导出PYTHONPATH =〜/ dev/code_playground:$ {PYTHONPATH}'。 – CristiFati

+0

谢谢@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']' –

+0

我刚刚注意到,在Windows中,code_playground目录包含在sys中。运行virtualenv之后的路径,而不必设置PYTHONPATH。但是,在Linux中并非如此。我想这就是它在Windows中工作的原因。@CristiFati(或任何其他人),你碰巧有什么洞察力,为什么这是? –

回答

0

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