【发布时间】: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