相关疑难解决方法(0)

恢复原始argv

当显式调用脚本时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)

python command-line-arguments python-3.x

10
推荐指数
2
解决办法
255
查看次数

python:获取操作系统的 argv[0],而不是 sys.argv[0]

(这个问题是在这里问的,但答案是特定于 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)

python

5
推荐指数
1
解决办法
235
查看次数