我在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
对于更好地构建此类项目的建议,我们将非常感激。
答案 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中没有的模块时,它非常方便。