Python setuptools 入口脚本是否可以与它所在的包同名?

Can a Python setuptools entry script have the same name as the package it is in?

提问人:Alex Petty 提问时间:11/7/2023 最后编辑:Alex Petty 更新时间:11/8/2023 访问量:31

问:

我正在尝试修复一些损坏的 python 包,这些包通过 bioconda 或 conda-forge 分发。他们中的许多人都有一个脚本,该脚本已被用作与包本身同名的入口点,例如 bigscape.py 在基因组学工具bigscape包中。

当我尝试使用 setuptools 为这些脚本创建入口脚本时,我希望它们具有与原始脚本相同的名称,例如 .我正在使用 setuptools 创建这些入口脚本:somepackage.pyconsole_script

     entry_points={
         'console_scripts': ['somepackage.py=somepackage.somepackage:main']
     },

但是,当软件包安装完毕后,原始脚本将按预期出现在目录中,但是当我尝试运行已安装的脚本时,我看到以下消息:pip installsomepackage.pysite-packagessomepackage.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.pysomepackage

最后,在 bigscape 的情况下,不能使用 setuptools 的功能将其复制为可执行脚本,因为引用了相对于自身的其他文件,这意味着它必须在包目录中运行,而不是从 python 环境的目录中运行。bigscape.pyscriptsbigscape.pybin

pip 设置工具 python 打包

评论

1赞 nisakova 11/7/2023
你能把它测试成吗'console_scripts': ['somepackage=somepackage.somepackage:main']

答: 暂无答案