重新创建 python 调用
Re-creating a python invocation
是否可以将被调用程序本身的 python 程序的可复制粘贴调用拼凑在一起?它不必是完全相同的调用字符串,但参数应该解析为相同的东西。
请注意,不幸的是,' '.join(sys.argv)
不会削减它。这种方法的主要问题是它不能正确地引用参数。考虑 dummy.py
和 import sys; print(sys.argv); print(' '.join(sys.argv))
运行 python dummy.py "1 2"
打印:
['dummy.py', '1 2']
dummy.py 1 2
当然,如果我们复制后者,我们将获得不同的调用。将每个参数用引号引起来也不起作用。考虑 dummy2.py
:
import sys
print(sys.argv)
print(' '.join('"{}"'.format(s) for s in sys.argv))
这将中断:
python dummy2.py ' " breaking " '
使用shlex.quote
:
import sys
from shlex import quote
print(' '.join(quote(s) for s in sys.argv))
在shell中:
python space_in_argv.py "aa bb" ' " breaking " '
产量:
space_in_argv.py 'aa bb' ' " breaking " '
您可能还想包括 sys.executable
,请参阅 more detail in the doc。
是否可以将被调用程序本身的 python 程序的可复制粘贴调用拼凑在一起?它不必是完全相同的调用字符串,但参数应该解析为相同的东西。
请注意,不幸的是,' '.join(sys.argv)
不会削减它。这种方法的主要问题是它不能正确地引用参数。考虑 dummy.py
和 import sys; print(sys.argv); print(' '.join(sys.argv))
运行 python dummy.py "1 2"
打印:
['dummy.py', '1 2']
dummy.py 1 2
当然,如果我们复制后者,我们将获得不同的调用。将每个参数用引号引起来也不起作用。考虑 dummy2.py
:
import sys
print(sys.argv)
print(' '.join('"{}"'.format(s) for s in sys.argv))
这将中断:
python dummy2.py ' " breaking " '
使用shlex.quote
:
import sys
from shlex import quote
print(' '.join(quote(s) for s in sys.argv))
在shell中:
python space_in_argv.py "aa bb" ' " breaking " '
产量:
space_in_argv.py 'aa bb' ' " breaking " '
您可能还想包括 sys.executable
,请参阅 more detail in the doc。