以git安全的方式从子目录导入Python模块

4

这是我当前的目录结构:

proj/
proj/__init__.py
proj/submodFolder/
proj/submodFolder/submod/
proj/submodFolder/submod/__init__.py

我正在写一个项目,我希望在proj/__init__.py中使用import submod或者import submodFolder.submod。然而,如果在submodFolder中没有__init__.py,这将无法实现。
假设submodFolder是一个git仓库,我已经对其进行了子仓库的操作(如果您愿意,可以将其视为第三方库);添加必要的__init__.py会破坏git子仓库,并且使从主仓库更新库变得复杂。
假设submodFolder是一个不可变的git子仓库,最好的方法是将python推到模块的树形结构中。修改python路径似乎是我想到的最近的解决方案,但是之前提出的所有问题都没有假设一个不可变的submodFolder。
欢迎提供示例,请注意相对路径。

你尝试过玩一下PYTHONPATH环境变量吗? - C2H5OH
我希望我的代码能够独立于环境运行 - 如果需要修改PYTHONPATH,应该在'proj/init.py'中以编程方式实现。 - JERiv
我尝试添加一个带有路径的proj/submod.pth文件,但似乎没有起作用。 - JERiv
1个回答

2

如果您不希望修改PYTHONPATH环境变量,您可以在proj/__init__.py中修改sys.path,以下内容应该有效:

import sys
import os
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'submodFolder'))

import submod

逐步代码和注释,这样就更容易理解:

# get absolute path to proj/__init__.py
script_path = os.path.realpath(__file__)

# strip off the file name to get the absolute path to proj
proj_path = os.path.dirname(script_path)

# join on os.sep to get absolute path to proj/submodFolder
submod_path = os.path.join(proj_path, 'submodFolder')

# add the complete path to proj/submodFolder to sys.path
sys.path.append(submod_path)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接