我有:
project
|--__init__.py
|--...
+--package1
| |--__init__.py
| |--...
+--dbs
|--...
其中project
是要由用户导入和使用的包的集合。名字只是一个例子。
现在,project/package1/
下的某些文件需要访问project/dbs/
中的某些文件,但是根据用户放置project
文件夹的位置以及他/她导入文件夹的位置,{{1} 1}}不一样。由于这个问题和其他目的,我认为我应该将变量path/to/project/dbs/file
定义为项目的根,相对于从中导入的位置。例如:
如果用户有projectroot
并从~/Desktop/project
导入,则~/
将为projectroot
,Desktop/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
。
答案 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