2024-04-19 18:20:59 发布
网友
我希望用于调用python脚本的命令在脚本本身中可用
比如:
python3 foo.py -a -b python foo.py -c
在foo.py中是否可以获得这些完整的命令
使用sys.executable和sys.argv:
sys.executable
sys.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:
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标志不存在
-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()将给出最后一个空字符串
cmdline
b"\x00"
split()
使用
sys.executable
和sys.argv
:以上内容应与Python2和Python3配合使用(以下是macOS的内容):
编辑
如果这还不够,您可以尝试psutil库(pip安装psutil):
macOS 10.15.2(Python 2.7和Python 3.7*):
Windows 10(Python 2.7和Python 3.8):
我能想到的最接近的事情是:
输出示例(在windows上):
在Unix环境中,您无权访问命令行本身—这不是特定于python的。但是,执行另一个程序的shell或其他行为良好的程序将在第一个参数中放置可执行文件名或路径
然而,Python的
sys.argv
并没有为您提供操作系统级的命令行您可以使用
sys.executable
获取python可执行文件,但这或sys.argv
都不能提供完整的命令行:说这是
foo.py
:然后:
如您所见,
-O
标志不存在如果您确实需要这些参数,那么获得它们的方法可能取决于操作系统(我不知道python是否允许您访问这些“低级”命令行参数)
如果您使用的是Linux,则可以执行以下操作:
结果是:
请注意,最后一个空字符串是由于
cmdline
具有以NUL结尾的字符串,因此最后一个字符将是b"\x00"
,因此split()
将给出最后一个空字符串相关问题 更多 >
编程相关推荐