【发布时间】:2021-12-18 04:36:06
【问题描述】:
我按照these 的说明创建了一个setup.py 文件,该文件将安装一个Python“可执行”脚本。这是我的项目结构:
pkgexec/
setup.py
pkgexec/
__init__.py
__main__.py
core.py
按照说明,__main__.py 的main() 方法是setup.py 中的入口点:
from setuptools import setup, find_packages
setup(
name="pkgexec",
version="0.2.0",
packages=find_packages(),
entry_points={ "console_scripts": ["pkgexec = pkgexec.__main__:main"]},
)
我通过运行 pip install -e . 从 pkgexec/ 目录中安装了该软件包。
到目前为止,一切都按预期进行。
没有的工作是通过这个“可执行”入口点执行 Python 脚本。你看,这个包的全部目的是运行 Python 脚本,从包中导入一堆东西,例如script.py 使用 pkgexec 包中的功能,并通过 pkgexec“可执行文件”“运行”:
pkgexec script.py -v arg1 arg2
这里是__main__.py的简化版:
import argparse
import sys
from pkgexec import some_stuff
def main(args=None):
if args is None:
args = sys.argv[1:]
parser = argparse.ArgumentParser()
parser.add_argument('script', help='script to run via pkgexec')
parser.add_argument(...)
cli_args = parser.parse_args()
print(f'{__name__}: Running script {cli_args.script}')
exec(open(cli_args.script).read(), globals(), globals()) # <-- ???
print(f'{__name__}: Done')
if __name__ == '__main__':
sys.exit(main())
问题:exec(open(cli_args.script).read()) 没有任何反应(尝试使用和不使用, globals(), globals())。该脚本未执行。我在这里做错了什么?
我不喜欢的解决方法:
- 如果我不“安装”入口点,我可以通过
exec()运行脚本。不是一种选择。 - 如果我通过
importlib导入脚本,我可以运行它。但这对于应该编写main()方法的软件包用户来说过于严格了。
【问题讨论】:
标签: python pip exec setuptools entry-point