我正在为虚拟机开发 Unix 环境下的 API。大多数模块都是用 python 开发的。我对此有几个问题。
我的文件扩展名为abc.py
.我想把它作为一个命令。例如,virtman dominfo [vmid]
应该是命令语法。现在我必须付出./virtman.py dominfo [vmid]
才能实现这一目标。我有#!/usr/bin/python
python 文件中的第一行。那么如何将其作为命令呢?
我的 echo $PATH 看起来像 '/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin0'
我读了很多文章,但没有得到清晰的了解,所以任何提示/建议都会有帮助。
答案1
您似乎误会了,这abc.py
不是命令。如果你可以执行它,那么,只是一个名称中带有点的程序。在您可以执行的意义上执行./abc.py
,因此必须设置执行位。如果你有比你做的事情python abc.py
还不是命令。
一般来说,要使普通的 python 文件abc.py
可执行,您应该确保第一行显示为:
#!/usr/bin/env python
(这假设你有/usr/bin/env
一个程序,并且会找到python
命令,该命令可能位于 中/usr/local/bin
。它还假设你想要运行默认值python
(通常是指向特定 python 版本的链接,如python2.7
),你也可以使用python3
if这可以作为命令使用)。
之后做
chmod +x abc.py
mv abc.py abc
然后你就可以运行了./abc
。如果当前目录在您的路径中,或者如果您移动abc
到路径中的目录,您应该能够abc
从任何地方执行。
然而,重命名和移动文件也有缺点:
- 您不能再这样做
from abc import SomeClass
,因为文件已重命名 - 如果文件处于修订控制之下,则它可能不再是
因此,我通常做的是创建一个/usr/local/bin/abc
如下所示的新文件:
#!/usr/bin/env python
from abc import main
main()
并在底部abc.py
:
def main():
doing the real stuff
if __name__ == '__main__':
main()
的目录abc.py
需要在 PATH 中 python 搜索模块,但这样就不必更改,并且可以被任何程序用作导入,并以python abc.py
.
1去掉命令名中的点是必要的,但不是真正必要的,如果不重命名也可以调用。mv
./abc.py
答案2
Anthon 的答案是正确的,但是对于重要的 Python 项目,您应该看看迪斯图尔斯标准库中的模块。它是设计的以“正确的方式”在系统上部署 python 模块和可执行文件,并且:
Python 开发人员熟悉(或者应该)这个模块,因为它位于标准库中,并且大多数知名的 Python 包(Django、NumPy、Celery 等)都在使用它。新人将立即知道如何部署您的项目。
一旦定义了项目中的文件和包,只需运行
python setup.py install
即可在系统上部署和更新包。不再需要手动更新
PATH
变量、复制文件/usr/local/bin
或将它们设置为可执行文件,这一切都为您处理!您可以使用
pip install -e
在开发模式下安装软件包。它在 Windows 或 OSX 环境中也是可移植的(某种程度上)。
另外,我不能推荐使用参数解析器,例如arg解析如果您正在设计命令行工具就足够了。