在 setup.py 中安装 "scripts" 作为 Python 包的一部分,在用户路径上并被识别为 Python 脚本

Installing "scripts" in setup.py as part of a Python package, on user's path and recognized as Python scripts

当用户使用 pip:

从 PyPI 安装我的包时,我试图在用户的路径上提供一个 Python 脚本
pip install MyPackage

MyPackage 在 PyPI 上并且安装成功——显然——在 conda 虚拟环境中。 setup.py 文件(摘录)如下所示:

try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

config = {
    'name': 'MyPackage',
    'version': '0.2.1.dev',
    'install_requires': [...],
    'packages': [
        'MyPackage', 'MyPackage.utils'
    ],
    'py_modules': [
        'MyCLI',
    ],
    'scripts': [
        'MyPackage/MyCLI.py',
    ],
...

在 GNU/Linux 上,当我键入 MyCLI 并按 Tab 键时,它成功地自动完成为 MyCLI.py。当我询问 which MyCLI.py 时,它显示了虚拟环境文件夹中 Python 脚本的完全限定路径:

$ which MyCLI.py
/home/arthur/Applications/miniconda3/envs/MyPackage/bin/MyCLI.py

MyCLI.py 使用 fire 包装 Python class,在命令行公开其方法,将文档字符串作为帮助文档提供,并解析参数。看起来像:

'''
My Command Line Interface
'''

class CLIRuntime(object):
    def run(self):
        do_something()


if __name__ == '__main__':
    import fire
    fire.Fire(CLIRuntime)

如果我 运行 这个脚本与 Python 解释器,它会正确执行。

python $(which MyCLI.py)

问题是,当我尝试 运行 它而不指定 Python 解释器时,它似乎认为它是一个 bash 脚本或二进制文件破坏了我的终端会话:

$ MyCLI.py
/home/arthur/Applications/miniconda3/envs/MyPackage/bin/MyCLI.py: line 8:
My Command Line Interface
: No such file or directory
from: can't read /var/mail/__future__

如何更改 setup.py 以便此脚本在用户路径上可用,但也称为/ 运行s 作为 Python 脚本?

我要注意,如果我在可编辑模式下使用 pip 从源安装此软件包 (pip install -e .),MyCLI.py 在我的路径上并且 运行s正确地作为 Python 脚本。从 PyPI 安装时它似乎不起作用。

要告诉你的shell应该使用什么程序来执行脚本文件,你需要添加一个“hash-bang”声明作为第一行 在脚本中。对于 Python 在 vi​​rtualenv 内部执行,

#!python

#!/usr/bin/env python

会成功的。如果您使用 Python 3,请改用 python3