捕获python -c"的一些代码"

时间:2017-04-15 20:11:46

标签: python

sys.argv上使用python -c "some code"我只获得['-c']时,如何可靠地访问作为字符串传递给-c的代码?

4 个答案:

答案 0 :(得分:0)

正如Imre的回答所指出的,解释器实际上跳过了一些箍,将原始命令行参数解析为sys.argv-c的参数不是sys.argv包含的内容,该参数的参数;

在Linux和其他一些系统上,您可以采用漫长的路线,使用os.getpid()来获取解释器的PID和proc文件系统以获得您自己的命令行。

python3 -c "import os; cmdline = open(os.path.join('/proc/', str(os.getpid()), 'cmdline')).readline().split('\x00'); print(cmdline[-2])"

Yayy,一个打印它自己代码的程序!

您可以通过检查-c是否不存在来检测您是否正在运行__main__.__file__。但请注意,__file__也不适用于交互式shell和-m - 执行。你必须在命令行上进行一些解析,这可能会变得棘手。

答案 1 :(得分:0)

选项列表在代码(作为字符串文字传递)之后根据手册开始:

  

指定要执行的命令(请参阅下一节)。   这将终止选项列表(以下选项作为参数传递   到命令)。

这意味着脚本的名称将替换为-c。在

python -c "import sys; print(sys.argv)" 1 2 3

结果

['-c', '1', '2', '3']

可能的解决方案是使用inspect模块,例如

python3 -c "import sys; import inspect; inspect.getsource(sys.modules[__name__])"

但它会导致TypeError,因为__main__模块是内置模块。

答案 2 :(得分:0)

在代码字符串后粘贴代码字符串的副本,以便它可用作sys.argv [1]。

C:\Users\Terry>python -c "import sys; print(sys.argv[1])" "import sys; print(sys.argv[1])"
import sys; print(sys.argv[1])

答案 3 :(得分:0)

这有效

python -c "import sys; exec(sys.argv[1])" "print 'hello'"

hello