你好, 我期待导入我有一个子目录一个Python文件,是的根目录下我的主要文件。例如
import ../library/utils.py
当我把它放到我的代码并运行它时,我得到一个编译错误。
有没有一种方法可以从主文件根目录下面包含文件,还是必须位于根目录下的子目录中?
感谢您的帮助。
你好, 我期待导入我有一个子目录一个Python文件,是的根目录下我的主要文件。例如
import ../library/utils.py
当我把它放到我的代码并运行它时,我得到一个编译错误。
有没有一种方法可以从主文件根目录下面包含文件,还是必须位于根目录下的子目录中?
感谢您的帮助。
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
这将为东西合作下开发,测试,培训。安装的文件不需要这样的结构。
这比Cat的答案稍微不准确,因为它试图计算正确的绝对路径来添加到sys.path,而不是假定进程工作目录将与Python包的基础相同。但是,它仍然不正确,因为'__file__'可能不会反映源的实际安装位置(字节码通常内置在临时构建目录中,然后重新定位到安装目录)。它也无法用于鸡蛋和zip文件。 – 2011-05-23 21:22:33
哇,你的100%解决方案显得非常酷! – Andrew 2011-05-23 21:27:15
只需使用一些zc.recipe.egg构建正确的路径:-) ...可能有点矫枉过正。 – kriss 2011-05-26 08:44:35
您不导入文件,您导入模块。相应地修改sys.path
,并做import utils
,例如
import sys
sys.path.append('../library')
import utils
这将起作用,但不以位置独立的方式。 – Andrew 2011-05-23 21:13:54
我为什么只应该导入模块。例如,我得到了一个名为credentials.py的文件,其中包含我在很多脚本中需要的数据库凭据。所有脚本都使用导入凭证并访问credentials.py中定义的变量。这是不好的做法吗?有什么建议? – Hyperboreus 2011-05-23 21:13:56
@Hyperboreus - 采取这种方式 - 您导入的任何文件都是模块。关于练习,以及..我也是这样:) – tmg 2011-05-23 21:18:43
谢谢你没有看到那一个。 – Nalum 2011-05-23 21:20:06