【问题标题】:Is there any way to know the command-line options available for a separate program from Python?有没有办法知道 Python 中单独程序可用的命令行选项?
【发布时间】:2020-12-06 10:22:21
【问题描述】:

我对 python 的 subprocessos 模块比较陌生。因此,我能够执行流程执行,例如使用 python 运行 bccat 命令并将数据放入 stdin 并从标准输出

现在我想首先知道像 cat 这样的进程通过 python 代码接受哪些标志(如果可能的话)。

然后我想执行一个设置了一些标志的特定命令。

我用谷歌搜索了这两件事,似乎我得到了第二个的解决方案,但有多种方法。因此,如果有人知道如何做这些事情并以某种标准的方式进行,将不胜感激。

【问题讨论】:

  • 你在说什么标志?你是指ls -l 中的-l 之类的东西吗?作为这里的新用户,也请带上tour并阅读How to Ask
  • 是的,我想知道是否有一些方法可以在终端中执行类似“man”的功能
  • 您通常需要使用-h--help 选项调用命令并解析输出。

标签: python linux subprocess


【解决方案1】:

在进程的上下文中,这些标志称为参数,因此也称为参数向量argv。他们的解释 100% 取决于调用的程序。换句话说,您必须阅读要调用的程序的联机帮助页或其他文档。

但有一个警告:如果您不直接调用程序而是通过 shell 调用程序,那么该 shell 就是正在启动的实际进程。然后它还解释通配符。例如,如果您使用参数向量['*'] 运行cat,它将输出名为* 的文件的内容(如果存在),如果不存在则输出错误。如果您使用['-c', 'cat *'] 运行/bin/sh,shell 将首先将* 解析为当前目录中的所有条目,然后将它们作为单独的参数传递给cat

【讨论】:

  • 虽然 Docker(像一些更糟糕的 pstop 工具)在没有明确参数边界的情况下将它的运行记录为 sh -c cat *,但这是一个危险的遗漏,不应遵循一个例子; argv 最好写成sh -c 'cat *'['sh', '-c', 'cat *'],清楚地表明所有被解析为代码的东西都包含在-c 之后的单个参数中(而后面的参数进入$0$1 等)除非紧跟在-c 之后的参数中的代码引用了它们,否则此后将被使用)。
  • @CharlesDuffy。 Docker 与这个问题有什么关系?
  • @UlrichEckhardt 您的回答没有尝试回答 OP 的问题。
  • @fpmurphy,我提到 Docker 是 Ulrich 可能会得到错误的sh -c cat * 表示的地方之一,他们在最初写的答案中使用了这种表示。这是对答案的评论,而不是问题,是有原因的。
  • 我认为将argv 表示为字符串列表@CharlesDuffy 以进行区分是个好主意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
相关资源
最近更新 更多