【问题标题】:Installing "scripts" in setup.py as part of a Python package, on user's path and recognized as Python scripts在 setup.py 中安装“脚本”作为 Python 包的一部分,在用户路径上并被识别为 Python 脚本
【发布时间】:2020-12-17 20:22:27
【问题描述】:

当用户使用 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 类,在命令行中公开其方法,将文档字符串显示为帮助文档,并解析参数。它看起来像:

'''
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 以便此脚本在用户路径上可用,但也称为 / 作为 Python 脚本运行?

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

【问题讨论】:

  • 你不能在第一行添加#!python3#!/usr/bin/env python吗?
  • @MattDMo 可能就是这样。想要添加它作为答案?

标签: python setuptools pypi distutils


【解决方案1】:

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

#!python

#!/usr/bin/env python

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-04
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 2012-07-21
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多