当显式调用脚本时python,它会argv被删除,因此这argv[0]是运行脚本的路径.如果被调用为python foo/bar.py甚至如此,就是这种情况python -m foo.bar.
我需要一种方法来恢复原始argv(即收到的原始python).不幸的是,它并不像前面那样容易sys.executable,sys.argv因为python foo/bar.py它不同于python -m foo.bar(隐式的PYTHONPATH不同,这可能是至关重要的,具体取决于你的模块结构).
更具体地说,在python foo/bar.py some other args和的情况下python -m foo.bar some other args,我正在寻找恢复['python', 'foo/bar.py', 'some', 'other', 'args']和['python', '-m', 'foo.bar', 'some', 'other', 'args']分别.
我知道之前的问题:
但是这些似乎误解了炮弹是如何运作的,而答案却反映了这一点.我没有兴趣在解开外壳的工作(如评估壳VAR和功能都很好),我只是想在原来的argv给予python.
我发现的唯一解决方案是使用/proc/<PID>/cmdline:
import os
with open("/proc/{}/cmdline".format(os.getpid()), 'rb') as f:
original_argv …Run Code Online (Sandbox Code Playgroud) (这个问题是在这里问的,但答案是特定于 Linux 的;我在 FreeBSD 和 NetBSD 系统上运行,这些系统(编辑:通常)没有/proc。)
Python 似乎很笨拙argv[0],因此您不会像 C 程序那样获得传递给进程的内容。公平地说,sh、bash 和 Perl 也好不到哪里去。有什么办法可以解决这个问题,这样我的 Python 程序就可以获得原始值吗?我在这个 FreeBSD 系统上有管理权限,可以做一些事情,比如更改每个人的默认 PATH 环境变量以指向包含 python2 和 python3 的目录之前的某个其他目录,但我无法控制创建/proc. 我有一个脚本来说明这个问题。首先,脚本的输出:
the C child program gets it right: arbitrary-arg0 arbitrary-arg1
the python2 program dumbs it down: ['./something2.py', 'arbitrary-arg1']
the python3 program dumbs it down: ['./something3.py', 'arbitrary-arg1']
the sh script dumbs it down: ./shscript.sh arbitrary-arg1
the bash script dumbs it down: ./bashscript.sh arbitrary-arg1
the perl script drops …Run Code Online (Sandbox Code Playgroud)