在 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 在 virtualenv 内部执行,
#!python
或
#!/usr/bin/env python
会成功的。如果您使用 Python 3,请改用 python3
。
当用户使用 pip
:
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 在 virtualenv 内部执行,
#!python
或
#!/usr/bin/env python
会成功的。如果您使用 Python 3,请改用 python3
。