如何在Python中获取操作系统的argv[0](而不是sys.argv[0])?

9 投票
1 回答
1062 浏览
提问于 2025-04-16 11:02

我想在一个Python程序中获取操作系统真正的argv[0]值。Python里的sys.argv[0]并不是这个值:它是正在执行的Python脚本的名字(有些例外情况)。我想要的是一个名为foo.py的程序,当我执行它时,它会打印出"somestring"。

exec -a "somestring" python foo.py

但是这个简单的程序

#! /usr/bin/env python
import sys
print sys.argv[0]

却会打印出"foo.py"。

有没有人知道怎么才能得到这个值?在Python的C API中有一些相关的函数,比如Py_GetProgramName。但似乎在Python中没有地方可以使用这个函数。Py_GetProgramFullPath是基于argv[0]的,但它会尝试获取Python解释器的路径,结果并不正确。(这个值会传递到sys.executable,所以这个变量也不对。)我真的需要写一个C模块才能获取这个值吗?

编辑:我也在这里问过这个问题,但没有得到有用的回答。

1 个回答

7

在Linux系统中,你可以查看这个文件的内容:/proc/self/cmdline

#!/usr/bin/env python
import sys
print sys.argv[0]

f = open('/proc/self/cmdline', 'rb')
cmdline = f.read()
f.close()

print repr(cmdline.split('\x00'))

然后你会看到这样的输出:

$ bash
$ exec -a "somestring" python foo.py 
foo.py
['somestring', 'foo.py', '']

看起来在bash中有个小问题,执行exec命令会替换掉当前的shell,这样在解释器退出后,终端会自动关闭。这就是第一个bash的情况。

撰写回答