在setuptools入口点使用importlib动态导入未安装脚本的问题
问题原因
你遇到的问题核心是**extra.py没有被包含在安装的包中**,且通过console_scripts注册的hello命令启动时,Python的模块搜索路径(sys.path)指向的是虚拟环境的site-packages目录,而非你的项目本地目录,因此找不到未被安装的extra模块。
解决方案
方案1:将extra.py纳入包结构(推荐)
如果extra.py本身属于包的功能模块,调整目录结构把它移入A包内:
. ├── A ├── __init__.py ├── cli.py └── extra.py ├── .venv ├── pyproject.toml ├── setup.cfg └── extra_test.py
修改cli.py的导入逻辑,改为导入包内模块:
# cli.py import importlib extra = importlib.import_module('A.extra') def main(): extra.hello()
只要setup.cfg中已配置packages = A,重新执行pip install .后,A.extra会被安装到site-packages,运行hello命令即可正常调用。
方案2:保留extra.py在外部,手动指定搜索路径
若确实不想将extra.py打包进安装包,可以通过以下方式让Python找到它:
- 方法A:设置环境变量
运行hello命令前,将extra.py所在目录加入PYTHONPATH:
# Linux/macOS export PYTHONPATH=/你的项目绝对路径:$PYTHONPATH hello # Windows set PYTHONPATH=C:\你的项目绝对路径;%PYTHONPATH% hello
- 方法B:在cli.py中动态添加路径
修改cli.py,将extra.py所在目录(假设为当前工作目录)加入搜索路径:
# cli.py import sys import os import importlib # 把当前工作目录加入模块搜索路径 sys.path.append(os.getcwd()) extra = importlib.import_module('extra') def main(): extra.hello()
注意:这种方式要求用户必须在extra.py所在的目录下运行hello命令。
补充说明
直接运行extra_test.py能正常工作的原因是:Python执行脚本时会自动把当前工作目录加入sys.path,因此能找到同目录下的extra.py;而通过console_scripts安装的命令,启动时的sys.path仅包含虚拟环境的site-packages等系统路径,不包含你的项目本地目录。
内容的提问来源于stack exchange,提问作者Henrique Hott
相关产品推荐
相关产品推荐

