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



我正在用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

任何关于更好的方法来构建这样一个项目的建议将不胜感激。

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

if __name__ == '__main__':
    import sys   
    from package import app
    sys.exit(app.run())
接下来,创建一个顶级包,将所有模块组合在一起,并在与main.py相同的目录中为它提供一个访问点。然后,您应该能够消除所有的路径操作代码,并简单地从应用程序中的任何模块使用完全指定的import语句,如from package.module import function

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

  • http://docs.python.org/tutorial/modules.html the-module-search-path
  • http://www.doughellmann.com/PyMOTW/site/index.html

为了解决这个问题,你可以使用pth (python-search-path)文件,其中包含所需模块存在的路径列表。

然后在主脚本中执行

import site
site.addsitedir(".")

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

你没有提到你在做什么操作系统。这个答案在很大程度上以Linux(或类unix)环境为前提。如果你使用的是Windows操作系统,就得有人来插话了。

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

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

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

您可能还想了解一下virtualenv包,它允许您创建自己的Python环境,您可以在其中安装自己的包。当您需要安装系统Python中不可用的模块时,它非常方便。

最新更新