2016-02-11 43 views
0

我试图运行一个python文件,但我不断收到一个ImportError。ImportError找不到模块

我的设立是我有以下路径的一个项目:

/Users/John/Documents/pythonprojects/projectX 

其中包含标题为“py_file”和“初始化”两个Python文件“projectX创建”我已经叫一个文件夹“组件”内。

/Users/John/Documents/pythonprojects/projectX/components 

在 'py_file' 的顶部,我输入了在 '初始化'

`from components import some_tuple` 

定义的namedTuple当我运行python py_file.py run我得到ImportError: No module named components

但是,如果我想补充的线下方,我可以得到该文件运行:

import sys 
sys.path.append("..") 

任何想法什么继续与此?

+0

你有'init.py'或'__init __。py'吗? – bernie

+0

@bernie'__init __。py' – Brosef

+1

'from .components import some_tuple'。 – Evert

回答

0

您应该确保您的PYTHONPATH环境变量设置为/Users/John/Documents/pythonprojects/projectX

实际上,这是你做什么与该行sys.path.append(".."),因为从py_file.py相对..目录/Users/John/Documents/pythonprojects/projectX

+0

这是正确的方式做到这一点:'PYTHONPATH = “/用户/约翰/文档/ pythonprojects/projectX创建”'然后 '出口PYTHONPATH' – Brosef

+0

哎呦我的意思是'PYTHONPATH =“/用户/约翰/文档/ pythonprojects/projectX:$ PYTHONPATH“'then'export PYTHONPATH' – Brosef

+0

是的:您可以一次执行:'export PYTHONPATH =”/ Users/John/Documents/pythonprojects/projectX:$ PYTHONPATH“'。这假设你在OS X上使用默认的bash shell。 – Evert

0

from components import some_tuple

Python,在你开始从它的目录中寻找components。但是,您在组件目录中启动了Python ,所以这不起作用。将".."附加到您的路径似乎解决了这个问题,因为现在Python将在包含components的父目录中查找。

但是,更好的方法是单独离开sys.path。找出程序中的哪个.py文件将成为入口点,并在执行该入口时使所有导入工作。然后,总是从那里执行你的程序。如果你想在某个地方快速测试一些小模块,请写一些测试!

如果你想从任何地方开始执行的灵活性,你可以看看relative imports。就我个人而言,我认为在绝对进口有意义之前,这些情况会更好。

+0

嘿,本,通过确定哪个文件将成为入口点,不太确定你的意思。 – Brosef

+0

从你的问题来看,你是不是正在编写一个库或者某个东西来被用户交互地运行。我猜测后者。在这种情况下,您的项目可能有数十个.py文件,但您的用户将始终运行'python projectx.py'来启动它。这使得'projectx.py'成为切入点。 –

+0

你是对的,它是后者。入口点将是另一个尚未写入的python文件。这个文件将成为暂时的入口点。 – Brosef