2011-05-23 168 views
1

可能重复:
Python package structure进口蟒蛇文件

你好, 我期待导入我有一个子目录一个Python文件,是的根目录下我的主要文件。例如

import ../library/utils.py 

当我把它放到我的代码并运行它时,我得到一个编译错误。

有没有一种方法可以从主文件根目录下面包含文件,还是必须位于根目录下的子目录中?

感谢您的帮助。

+0

谢谢你没有看到那一个。 – Nalum 2011-05-23 21:20:06

回答

3
import sys, os 
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'library'))) 

import utils 

这将修改包含目录搜索文件的sys.path的变量。这也将确保它会即使您运行它正确地找到它:

$ python the_file.py 
$ python ../the_file.py 
$ python /somewhere/over/the_file.py 

这将为东西合作下开发,测试,培训。安装的文件不需要这样的结构。

+0

这比Cat的答案稍微不准确,因为它试图计算正确的绝对路径来添加到sys.path,而不是假定进程工作目录将与Python包的基础相同。但是,它仍然不正确,因为'__file__'可能不会反映源的实际安装位​​置(字节码通常内置在临时构建目录中,然后重新定位到安装目录)。它也无法用于鸡蛋和zip文件。 – 2011-05-23 21:22:33

+2

哇,你的100%解决方案显得非常酷! – Andrew 2011-05-23 21:27:15

+0

只需使用一些zc.recipe.egg构建正确的路径:-) ...可能有点矫枉过正。 – kriss 2011-05-26 08:44:35

9

您不导入文件,您导入模块。相应地修改sys.path,并做import utils,例如

import sys 
sys.path.append('../library') 
import utils 
+1

这将起作用,但不以位置独立的方式。 – Andrew 2011-05-23 21:13:54

+0

我为什么只应该导入模块。例如,我得到了一个名为credentials.py的文件,其中包含我在很多脚本中需要的数据库凭据。所有脚本都使用导入凭证并访问credentials.py中定义的变量。这是不好的做法吗?有什么建议? – Hyperboreus 2011-05-23 21:13:56

+0

@Hyperboreus - 采取这种方式 - 您导入的任何文件都是模块。关于练习,以及..我也是这样:) – tmg 2011-05-23 21:18:43