这可能听起来很愚蠢,但我只需要知道这是怎么可能的。
我有一个 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"
有人知道如何实现这个设置吗?
您可以使用
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"
这在类 Unix 系统和 Windows 中的做法有所不同。类 Unix 更容易。
您需要做四件事:
hello
。 (如果您将其保留为 hello.py
,它也会起作用,但随后您将称其为 hello.py --message "Hi my name is Tony"
)。chmod 755 hello
。#!
开头。这不是 Python 功能,而是 Unix shell 功能。对于Python来说,这只是一个注释。但是 Unix shell 会查看该行以确定应该使用哪个程序来运行该文件。如今,Python 程序最安全的 shebang 行似乎是 #!/usr/bin/env python3
,因为某些系统默认没有“python”可执行文件,它们只有“python3”可执行文件。echo $PATH
查看目录列表(它们用冒号分隔)。例如,当您键入 ls
时,shell 将按顺序搜索该目录列表,直到找到名为 ls
的可执行文件。在该特定示例中,它通常会在 /bin
目录中找到它。对于初学者来说,将 hello
放在 /usr/local/bin
中是许多类 Unix 系统中的最佳选择,就像大多数 GNU/Linux 系统一样;该目录用于通过系统包管理器以外的任何方式添加到系统的可执行文件。对于某些类 Unix 系统(例如 Mac OS X),相应的目录可能会有所不同。超越初学者阶段,您将需要使用 virtualenvs,并且 virtualenv demystified 将是阅读此答案后的好东西。
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 中实现这一点并不容易。)
查看这篇文章:https://gist.github.com/umangahuja1/51da3a453803f1f67f4eee5de129d4db
本质上你想要做的是修改你的脚本来告诉系统它应该使用 python 路径而不是 shell 来运行。之后,您将权限设置为可执行,然后运行它。
您可以使用 sys 来获取参数
import sys
然后获取这样的参数:
args = sys.args()
运行时,使用:
py hello.py argument1 argument2