我有:
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或类似的文件中。