当PYTHONPATH无法修改时,在Python中导入其他模块的最佳方法?

时间:2011-10-28 13:08:35

标签: python module directory project import

我在python中编写我的第一个项目,我不确定如何处理导入。我正在大学的计算机上工作,无法修改PYTHONPATH变量。我也在从各种计算机/操作系统开始研究这个项目(因此项目的路径并不总是一样)。

我在不同的文件夹中有许多不同的模块,它们都互相导入。目前,我使用file_path = os.path.abspath(__file__)从另一个模块获取路径,然后回溯目录,然后在其中附加包含所需模块的文件夹。然后使用sys.path.append(symantic_root)将其添加到PYTHONPATH。

这个系统有效,但最终看起来非常混乱,每个模块的开头都有很多重复的代码,例如:

import os
import sys
# Get the path to the directory above the directory this file is in, for any system
file_path = os.path.abspath(__file__)
root_path = os.path.dirname(os.path.dirname(file_path))
# Get the paths to the directories the required modules are in
symantic_root = os.path.join(root_path, "semantic_analysis")
parser_root = os.path.join(root_path, "parser")
# Add the directories to the path variable
sys.path.append(symantic_root)
sys.path.append(parser_root)
import semantic_analyser
import jaml

对于更好地构建此类项目的建议,我们将非常感激。

3 个答案:

答案 0 :(得分:1)

首先,您应该阅读以下文档中有关Python路径的一些内容:

要解决您的问题,您可以使用包含所需模块所在路径列表的pth(python-search-path)文件。

然后从你的主脚本中你可以做到

import site
site.addsitedir(".")

会自动将这些目录附加到PYTHONPATH

答案 1 :(得分:1)

首先,创建一个简单的main.py脚本,为您的应用程序提供单一的入口点。例如:

if __name__ == '__main__':

    import sys   
    from package import app

    sys.exit(app.run())

接下来,创建一个顶级软件包,将所有模块组合在一起,并在与main.py相同的目录中为提供一个访问点。然后,您应该能够消除所有路径操作代码,并且只需在应用程序中的任何模块中使用完全指定的导入语句,如from package.module import function

答案 2 :(得分:0)

您没有提到您正在使用的操作系统。这个答案大多以Linux(或类Unix)环境为前提。如果你在Windows上,其他人将不得不插话。

从你的例子中不清楚为什么你要经历所有这些扭曲。首先,您如何修改PYTHONPATH?这只是一个shell环境变量。如果您可以登录并运行Python,那么您可以明确拥有设置自己的环境变量的必要访问权限。

但我甚至不确定这是否必要。如果您只是将所有自定义模块安装到您自己的库目录中,并按照vinilios的建议安装.pth文件,您可以执行以下操作:

import site
import os

site.addsitedir(os.path.expanduser('~/lib/python'))

您可能还想查看virtualenv包,它允许您创建自己的Python环境,您可以在其中安装自己的包。当您需要安装系统Python中没有的模块时,它非常方便。