如何无需修改Python包内部代码,正确配置内部导入?
我正在开发一个Python 3包(Project1),希望在另一个Python项目(Project2)中使用它。Project1的目录结构如下:
/global_project_folder |-different_garbage... |-setup.py |-/src |-/project1 |-__init__.py |-mainmodule.py |-auxmodule1.py |-auxmodule2.py |-etc...
setup.py遵循官方打包规范,项目名称为project1。
mainmodule.py的代码如下:
import auxmodule1 from auxmodule2 import AuxMethod21,AuxMethod22 def MainMethod(): return auxmodule1.AuxMethod11()*(AuxMethod21()+AuxMethod22())
我通过python3 -m pip install -e .以开发模式安装了Project1,pipdeptree -l显示该包已在可用列表中。
现在在Project2中编写代码:
from project1.mainmodule import MainMethod
测试时出现错误:ModuleNotFoundError: No module named 'auxmodule1'。
若将Project1的mainmodule.py修改为以下代码则一切正常,但此修改会导致Project1代码无法在包外直接运行:
import project1.auxmodule1 from project1.auxmodule2 import AuxMethod21,AuxMethod22
我希望保持Project1的结构和代码不变,请问有何变通方案?
方案1:通过环境变量PYTHONPATH指定模块路径
在运行Project2的代码前,将Project1的src/project1目录添加到PYTHONPATH环境变量中,让Python能在该目录下找到auxmodule1等模块。
Linux/macOS:
export PYTHONPATH=/path/to/global_project_folder/src/project1:$PYTHONPATH # 随后运行Project2的脚本 python your_project2_script.pyWindows(命令提示符):
set PYTHONPATH=C:\path\to\global_project_folder\src\project1;%PYTHONPATH% python your_project2_script.pyWindows(PowerShell):
$env:PYTHONPATH = "C:\path\to\global_project_folder\src\project1;$env:PYTHONPATH" python your_project2_script.py
方案2:在Project2中动态添加路径
在Project2的入口脚本开头,手动将Project1的src/project1目录添加到Python的模块搜索路径中:
import sys sys.path.append('/path/to/global_project_folder/src/project1') from project1.mainmodule import MainMethod
注意:此方法需要硬编码路径,若Project1的位置变动,需同步修改该路径。
方案3:调整Project1的内部运行方式
如果需要在Project1内部直接运行mainmodule.py,可以切换到/global_project_folder/src目录,用模块方式启动:
cd /global_project_folder/src python -m project1.mainmodule
这种方式无需修改代码,同时能兼容后续按规范调整导入方式的场景,也不影响Project2的正常导入。
内容的提问来源于stack exchange,提问作者Даниил Галахов

