0

我有:

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,正如预期的那样。

4

2 回答 2

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 或类似文件中。

于 2013-05-31T02:46:14.683 回答
0

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

于 2013-05-31T03:33:06.090 回答