提问人:Alex Petty 提问时间:11/7/2023 最后编辑:Alex Petty 更新时间:11/8/2023 访问量:31
Python setuptools 入口脚本是否可以与它所在的包同名?
Can a Python setuptools entry script have the same name as the package it is in?
问:
我正在尝试修复一些损坏的 python 包,这些包通过 bioconda 或 conda-forge 分发。他们中的许多人都有一个脚本,该脚本已被用作与包本身同名的入口点,例如 bigscape.py 在基因组学工具bigscape包中。
当我尝试使用 setuptools 为这些脚本创建入口脚本时,我希望它们具有与原始脚本相同的名称,例如 .我正在使用 setuptools 创建这些入口脚本:somepackage.py
console_script
entry_points={
'console_scripts': ['somepackage.py=somepackage.somepackage:main']
},
但是,当软件包安装完毕后,原始脚本将按预期出现在目录中,但是当我尝试运行已安装的脚本时,我看到以下消息:pip install
somepackage.py
site-packages
somepackage.py
ModuleNotFoundError: No module named 'somepackage.somepackage'; 'somepackage' is not a package
我有一个完整的最小复制品,如下所示:
.
├── setup.py
└── src
└── somepackage
├── __init__.py
└── somepackage.py
setup.py:
#!/usr/bin/env python
from distutils.core import setup
setup(
name='somepackage',
packages=['somepackage'],
package_dir={'somepackage': 'src/somepackage'},
entry_points={
'console_scripts': ['somepackage.py=somepackage.somepackage:main']
},
description='test'
)
somepackage.py
def main():
print("I am running inside the package")
我可以通过更改入口脚本的名称来解决此问题,如下所示:
entry_points={
'console_scripts': ['some_other_name.py=somepackage.somepackage:main']
}
但是,现有用户习惯于调用包,更改可执行文件名称可能会造成混淆。/the/path/to/somepackage.py
我是否缺少某种方法来指定当入口脚本运行时,它应该在 site-packages 中导入包而不是导入自身?问题似乎是当调用入口脚本时,它找不到包,而是最终导入自身。也可以更改包的名称,但这也会给现有用户造成命名混淆。somepackage.py
somepackage
最后,在 bigscape 的情况下,不能使用 setuptools 的功能将其复制为可执行脚本,因为引用了相对于自身的其他文件,这意味着它必须在包目录中运行,而不是从 python 环境的目录中运行。bigscape.py
scripts
bigscape.py
bin
答: 暂无答案
评论
'console_scripts': ['somepackage=somepackage.somepackage:main']