相对于导入位置的文件路径

时间:2013-05-31 01:53:57

标签: python package directory-structure

我有:

project
|--__init__.py
|--...
+--package1
|  |--__init__.py
|  |--...
+--dbs
   |--...

其中project是要由用户导入和使用的包的集合。名字只是一个例子。

现在,project/package1/下的某些文件需要访问project/dbs/中的某些文件,但是根据用户放置project文件夹的位置以及他/她导入文件夹的位置,{{1} 1}}不一样。由于这个问题和其他目的,我认为我应该将变量path/to/project/dbs/file定义为项目的根,相对于从中导入的位置。例如:

如果用户有projectroot并从~/Desktop/project导入,则~/将为projectrootDesktop/project将为path/to/project/dbs/file。这真的需要吗?如果是这样,最好的方法是什么?


我尝试在"%s/dbs/file" % (projectroot)中使用this并使用project/pathtfinder.py作为

project/__init__.py

但是当我跑import pathfinder projectroot=pathfinder.module_path() import package1 时,我得到了

import project

如果在定义它之后使用Traceback (most recent call last): File "<stdin>", line 1, in <module> File "project/__init__.py", line 3, in <module> import package1 File "project/package1/__init__.py", line 5, in <module> db = sqlite3.connect("%s/dbs/main.db" % projectroot) NameError: name 'projectroot' is not defined ,我会按预期获得print projectroot

2 个答案:

答案 0 :(得分:0)

这是我用于Flask应用程序的模式,但同样适用于您:

假设以下内容位于helloworld/app.py

下的文件中
import sys
import os
# Add this app to the path so imports work as expected
APP_PATH = os.path.join(os.path.dirname(__file__), '../')
sys.path.append(APP_PATH)

from helloworld.utils import a_utility

约定解释了自己,但它允许从项目的“根”进行导入,无论文件放在何处。您可能希望将APP_PATH代码放在 init .py或类似代码中。

答案 1 :(得分:0)

您需要将项目路径添加到PYTHONPATH