当前位置:  开发笔记 > 编程语言 > 正文

键入的完整命令行

如何解决《键入的完整命令行》经验,为你挑选了4个好方法。

我想获得键入的完整命令行.

这个:

" ".join(sys.argv[:])

在这里不起作用(删除双引号).此外,我不想重新加入被解析和拆分的东西.

有任何想法吗?



1> Martin Carpe..:

你太迟了.当类型命令到达Python时,你的shell已经发挥了它的魔力.例如,引用消耗(正如您所注意到的),变量得到插值等.



2> dmckee..:

在Unix环境中,这通常是不可能的...您可以期望的最好的是传递给您的进程的命令行.

因为shell(基本上是任何 shell)可能会在将其输入OS以执行之前以多种方式处理类型化命令行.



3> jfs..:

*nix中

查看初始堆栈布局(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).



4> Roboprog..:

如上所述,这可能无法完成,至少不可靠.在少数情况下,您可能能够找到shell的历史文件(例如 - "bash",但不是"tcsh")并从中获取用户的输入.我不知道你对用户的环境有多少控制权.


即使在.history中,也已经应用了一些处理(!替换至少......).但是,为了聪明,+1.不错的想法.
推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有