如何使用唯一的命令b而不是使用“python”关键字来运行Python文件

问题描述 投票:0回答:4

这可能听起来很愚蠢,但我只需要知道这是怎么可能的。

我有一个 python 文件“hello.py”,它使用

argParse
接受参数。

代码如下:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--message", type=str, required=True)
args = parser.parse_args()

message = args.message
print(f'Your message: {message}' )

当我运行时,代码按预期工作:

python hello.py --message "Hi my name is Tony"

我得到以下输出:

您的留言:嗨,我的名字是托尼

但是,要求是当我输入命令时,我想以

python hello.py
可以替换为唯一命令的方式运行它。

希望我可以从任何目录运行此命令

hello
。有点像环境变量一样需要它。

我想将其制作为 Python 包,上传到 pypi.org,在有人进行 pip 安装后,他们应该能够运行类似的东西:

hello --message "Hi my name is Tony"

有人知道如何实现这个设置吗?

python python-3.x python-2.7
4个回答
3
投票

您可以使用

setuptools
将命令安装为入口点(请参阅 setuptools 快速入门)。

作为针对您的案例的快速、扁平的解决方案,您应该有一个包含以下文件的目录(根):

root
|    pyproject.toml
|    setup.cfg
|    hello.py

pyproject.toml:

[build-system]
requires = ["setuptools"]
build-backend = "setuptools.build_meta"

设置.cfg:

[options.entry_points]
console_scripts =
    hello = hello:main

你好.py:

import argparse

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--message", type=str, required=True)
    args = parser.parse_args()

    message = args.message
    print(f'Your message: {message}' )

然后,您可以通过从根目录运行:

python -m pip install .
(不要忘记
.
)来安装命令(当然,您需要安装
pip
)。

安装完成后,您应该可以根据需要运行命令:

hello --message "Hi my name is Tony"


2
投票

这在类 Unix 系统和 Windows 中的做法有所不同。类 Unix 更容易。

类Unix

您需要做四件事:

  1. 将脚本重命名为
    hello
    。 (如果您将其保留为
    hello.py
    ,它也会起作用,但随后您将称其为
    hello.py --message "Hi my name is Tony"
    )。
  2. 授予其执行权限:
    chmod 755 hello
  3. 添加一条“shebang line”。 shebang 行是脚本的第一行,以
    #!
    开头。这不是 Python 功能,而是 Unix shell 功能。对于Python来说,这只是一个注释。但是 Unix shell 会查看该行以确定应该使用哪个程序来运行该文件。如今,Python 程序最安全的 shebang 行似乎是
    #!/usr/bin/env python3
    ,因为某些系统默认没有“python”可执行文件,它们只有“python3”可执行文件。
  4. 将文件放入“shell 路径”中包含的目录中。 shell 路径是 shell 在其中查找可执行文件的目录列表。运行
    echo $PATH
    查看目录列表(它们用冒号分隔)。例如,当您键入
    ls
    时,shell 将按顺序搜索该目录列表,直到找到名为
    ls
    的可执行文件。在该特定示例中,它通常会在
    /bin
    目录中找到它。对于初学者来说,将
    hello
    放在
    /usr/local/bin
    中是许多类 Unix 系统中的最佳选择,就像大多数 GNU/Linux 系统一样;该目录用于通过系统包管理器以外的任何方式添加到系统的可执行文件。对于某些类 Unix 系统(例如 Mac OS X),相应的目录可能会有所不同。

超越初学者阶段,您将需要使用 virtualenvs,并且 virtualenv demystified 将是阅读此答案后的好东西。

Windows

Windows 没有提供开箱即用的简单解决方案,因此您需要使用第三方解决方案,例如

pyinstaller
,它会创建一个
.exe
文件,该文件通常包含 Python 解释器的副本。

还有一个更简单的解决方案。您可以创建一个执行您的程序的

hello.bat
文件。假设
python.exe
C:\Program Files\Python
中并且
hello.py
C:\Users\Alice
中,则文件的内容应为:

"C:\Program Files\Python\python.exe" "C:\Users\Alice\hello.py" %*

然后您可以将

hello.bat
放入系统路径中的目录中,例如
C:\Windows
。用户无需输入完整的
hello.bat
;与
.exe
文件一样,您可以省略扩展名,只需键入
hello

%*
代表赋予
hello.bat
的参数,因此如果用户输入
hello --message "Hi, I'm Tony"
,则批处理文件将执行
C:\...\python.exe C:\...\hello.py --message "Hi, I'm Tony"

画中画

假设您已经知道如何在 PyPI 中创建包(这完全是另一个故事),您可以使用

entry_points
setuptools.setup()
参数来执行您想要的操作。 (再次强调,我认为在 Windows 中实现这一点并不容易。)


0
投票

查看这篇文章:https://gist.github.com/umangahuja1/51da3a453803f1f67f4eee5de129d4db

本质上你想要做的是修改你的脚本来告诉系统它应该使用 python 路径而不是 shell 来运行。之后,您将权限设置为可执行,然后运行它。


-1
投票

您可以使用 sys 来获取参数

import sys

然后获取这样的参数:

args = sys.args()

运行时,使用:

py hello.py argument1 argument2
© www.soinside.com 2019 - 2024. All rights reserved.