【问题标题】:How can you obtain the OS's argv[0] (not sys.argv[0]) in Python?如何在 Python 中获取操作系统的 argv[0](不是 sys.argv[0])?
【发布时间】:2011-06-19 13:26:29
【问题描述】:

我想在 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 中有一些相关的函数:e.g. Py_GetProgramName。但这似乎并没有在任何地方暴露于 Python 世界。 Py_GetProgramFullPath 从 argv[0] 工作,但它试图获取 Python 解释器的路径。 (这个值被传播到 sys.executable,所以那个变量也不对。)我真的需要写一个 C 模块来获取这个值吗?

编辑:还问过(但没有帮助回答)here

【问题讨论】:

    标签: python


    【解决方案1】:

    在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。

    【讨论】:

    • 这不是 bash 的 bug,exec 命令将 shell 替换为另一个程序。
    • 哦,狡猾。如果这有可移植性问题,我不会感到惊讶,但这对我有好处。
    • 一个警告是,如果“python”被排除在exec 行之外,上述示例将中断,因为 hashbang 解释器和/usr/bin/env 不会传播 argv[0] 的设置.但这不是 Python 的错。
    • 在 Windows 上,您应该能够使用 wmi 读取命令行参数:请参阅:mail.python.org/pipermail/python-win32/2007-December/…
    • 我已经发布了一个更通用的解决方案,它不依赖于 /proc,因为 FreeBSD 没有,这里:stackoverflow.com/questions/59297692/…。 (它也适用于 Linux。)
    猜你喜欢
    • 1970-01-01
    • 2019-09-19
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 2010-09-21
    • 2014-12-02
    • 1970-01-01
    相关资源
    最近更新 更多