在setup.py中将“脚本”作为Python软件包的一部分安装在用户的路径上,并被识别为Python脚本

问题描述

当用户使用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在可编辑模式(pip install -e .)中从源代码安装此软件包,则MyCLI.py在我的路径上,可以作为Python脚本正确运行。从PyPI安装时,它似乎不起作用。

解决方法

要告诉您的shell应该使用什么程序来执行脚本文件,您需要在脚本的第一行添加声明“ 。对于在virtualenv内部执行的Python,

#!python

#!/usr/bin/env python

可以解决问题。如果您使用的是Python 3,请改用python3

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...