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