我想获得键入的完整命令行.
这个:
" ".join(sys.argv[:])
在这里不起作用(删除双引号).此外,我不想重新加入被解析和拆分的东西.
有任何想法吗?
你太迟了.当类型命令到达Python时,你的shell已经发挥了它的魔力.例如,引用消耗(正如您所注意到的),变量得到插值等.
在Unix环境中,这通常是不可能的...您可以期望的最好的是传递给您的进程的命令行.
因为shell(基本上是任何 shell)可能会在将其输入OS以执行之前以多种方式处理类型化命令行.
查看初始堆栈布局(Linux on i386),它提供对程序命令行和环境的访问:该进程只能看到单独的参数.
您无法获得在一般情况下键入的命令行.在Unix上,shell将命令行解析为单独的参数,最终execv(path, argv)
调用调用相应系统调用的函数.sys.argv
派生argv
自传递给execve()
函数的参数.你可以得到一些等效的东西" ".join(map(pipes.quote, argv))
虽然你不需要,例如,如果你想用稍微不同的命令行参数重启脚本那么sys.argv
就足够了(在很多情况下),请参阅是否可以设置python -O(优化)脚本中的标志?
有一些创造性(非实用)的解决方案:
使用gdb附加shell并查询它(大多数shell能够重复相同的命令两次) - 您应该能够获得与键入的命令几乎相同的命令,或者如果在进程退出之前更新了历史文件,则直接读取它的历史文件
使用屏幕,脚本实用程序来获取终端会话
使用键盘记录器来获取键入的内容.
在Windows上,本机CreateProcess()
接口是一个字符串,但python.exe仍然以列表形式接收参数.subprocess.list2cmdline(sys.argv)
可能有助于扭转这一进程. list2cmdline
适用于使用与MS C运行时相同的规则的应用程序- python.exe
就是其中之一.list2cmdline
不会返回键入的命令行,但在这种情况下返回功能等效命令行.
在Python 2上,您可能需要GetCommandLineW()
从命令行获取无法在Windows ANSI代码页中表示的Unicode字符(例如cp1252).
如上所述,这可能无法完成,至少不可靠.在少数情况下,您可能能够找到shell的历史文件(例如 - "bash",但不是"tcsh")并从中获取用户的输入.我不知道你对用户的环境有多少控制权.