获取在脚本本身内部执行python脚本的命令

2024-04-19 18:20:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望用于调用python脚本的命令在脚本本身中可用

比如:

python3 foo.py -a -b
python foo.py -c

在foo.py中是否可以获得这些完整的命令


Tags: py命令脚本foopython3
3条回答

使用sys.executablesys.argv

from __future__ import print_function
import sys
print(sys.executable)
print(sys.argv)

以上内容应与Python2和Python3配合使用(以下是macOS的内容):

howes% python2 blah.py 1 -m 123 53131
/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python
['blah.py', '1', '-m', '123', '53131']
howes% python3 blah.py 1 -m 123 53131
/usr/local/opt/python/bin/python3.7
['blah.py', '1', '-m', '123', '53131']

编辑

如果这还不够,您可以尝试psutil库(pip安装psutil):

from __future__ import print_function
import os, psutil
us = psutil.Process(os.getpid())
print(us.cmdline())
print(us.exe())

macOS 10.15.2(Python 2.7和Python 3.7*):

howes% python blah.py -a 1 -b 2 3 4
['/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python', 'blah.py', '-a', '1', '-b', '2', '3', '4']
/System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python
howes% python3 blah.py -a 1 -b 2 3 4
['/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/MacOS/Python', 'blah.py', '-a', '1', '-b', '2', '3', '4']
/usr/local/Cellar/python/3.7.6_1/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/MacOS/Python
howes% 

Windows 10(Python 2.7和Python 3.8):

C:\Users\b.howes>python2 blah.py -a 1 -b 2 3 4
['python2', 'blah.py', '-a', '1', '-b', '2', '3', '4']
C:\Python27\python2.exe

C:\Users\b.howes>python blah.py -a 1 -b 2 3 4
['python', 'blah.py', '-a', '1', '-b', '2', '3', '4']
C:\Users\b.howes\AppData\Local\Programs\Python\Python38\python.exe

我能想到的最接近的事情是:

import sys
import os

s = ""
for arg in sys.argv:
    s = s + arg + " "

print(os.path.basename(sys.executable) + " " + s)

输出示例(在windows上):

$ python tmp.py -a -b
python.exe tmp.py -a -b

在Unix环境中,您无权访问命令行本身—这不是特定于python的。但是,执行另一个程序的shell或其他行为良好的程序将在第一个参数中放置可执行文件名或路径

然而,Python的sys.argv并没有为您提供操作系统级的命令行

您可以使用sys.executable获取python可执行文件,但这或sys.argv都不能提供完整的命令行:

说这是foo.py

import sys

print(sys.argv)
print(sys.executable)

然后:

$ python -O foo.py a b c
['foo.py', 'a', 'b', 'c']
/usr/bin/python

如您所见,-O标志不存在

如果您确实需要这些参数,那么获得它们的方法可能取决于操作系统(我不知道python是否允许您访问这些“低级”命令行参数)

如果您使用的是Linux,则可以执行以下操作:

import os

with open("/proc/%s/cmdline" % os.getpid(), "rb") as f:
    cmdline = f.read()

print(cmdline.split(b"\x00"))

结果是:

$ python -O foo.py a b c
['python', '-O', 'foo.py', 'a', 'b', 'c', '']

请注意,最后一个空字符串是由于cmdline具有以NUL结尾的字符串,因此最后一个字符将是b"\x00",因此split()将给出最后一个空字符串

相关问题 更多 >