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



我有:

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

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

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

如果用户具有~/Desktop/project并将其从~/导入,则projectroot将是Desktop/project,而path/to/project/dbs/file将是"%s/dbs/file" % (projectroot)。这真的需要吗?如果是,最好的方法是什么?


我尝试在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之后使用它,我会得到Desktop/project,正如预期的那样。

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

这是我在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或类似的文件中。

最新更新