问题标签 [subprocess]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
19117 浏览

python - FFMPEG 和 Pythons 子进程

我正在尝试为FFMPEG. 我正在使用 pythons 子进程为我想要的每个转换创建一个 ffmpeg 进程。这很好用,但我也想要一种方法来获取转换的进度,无论它是否失败等等。我想我可以通过访问进程的标准输出来做到这一点,如下所示:

打电话subprocess.Popen()

并阅读stdout

这有效,但是 ffmpeg 的状态不显示。我假设它与 ffmpeg 刷新它的方式有关。有没有办法访问它?

0 投票
1 回答
1752 浏览

python - 使用 Python 以编程方式确定最大命令行长度

有谁知道 Python 确定系统最大命令行长度的可移植方式?我正在处理的程序构建一个命令并将其提供给子进程。对于具有较小命令行长度最大值的系统,命令可能会太长。如果我能检测到,可以分解命令以避免超过最大长度,但我还没有找到确定最大值的(便携式)方法。

0 投票
1 回答
988 浏览

subprocess - Drools SubProcess 映射失败 - 我做错了什么?

我创建了两个“Hello World”进程来给 subProcess 节点一个旋转。我无法将 subProcess 的输出返回到主进程。我希望有人能告诉我我做错了什么,因为我找不到任何说明我为什么不起作用的文档或示例。

在我的主要过程中,我有以下内容(请注意,我已经剪掉了页眉、页脚和位置 x、y、高度、宽度属性):

这是一个简单的subhelloSubProcess,它只是简单地获取输入并将其打印出来,然后获取输入长度以将其返回:

这是按照我解释文档和示例的方式。在主流程和子流程上都声明了所需的变量,然后只需使用 subProcess in/out 映射元素来设置 from 和 to 属性。

问题是....虽然name没有问题地传递给子进程,但试图length回到主进程失败了。subProcesslength中的 已成功修改。但在退出时,length主进程并没有改变。

我究竟做错了什么?非常感谢指针和解释。谢谢。

0 投票
1 回答
1122 浏览

python - 从无限期运行的 Popen 获取部分标准输出和标准错误

可能重复:
在 C 或 Python 中使用 popen 绕过子进程输出的缓冲

我正在围绕应该无限期运行的服务器 cmd 行脚本构建一个包装器。我需要做的是在不等待子流程完成的情况下获取当前的黑啤酒。

我的意思是,如果我运行以下命令,一切正常:

但是,如果我对无限期运行的程序做同样的事情:

它不会回来了……

更新:甚至

挂...

您知道是否有办法以独立于操作系统的方式从 Popen(或类似的线程实现)捕获部分输出?

0 投票
4 回答
5181 浏览

python - Python,子进程,devenv,为什么没有输出?

我从 Python 脚本构建了一个 Visual Studio 解决方案。一切都很好,除了我无法捕获构建输出。

在这里,两者outerr总是空的。无论构建成功与否,都会发生这种情况,如p.returncode.

0 投票
1 回答
2547 浏览

python - 需要解决方法:Python 的 select.select() 不适用于子进程的标准输出?

在我的主 python 程序中,我使用以下代码生成了一个子程序:

FWIW,孩子是一个PHP脚本,需要与python程序来回通信。

主 python 程序实际上需要侦听来自其他几个通道的通信 - 使用相同代码生成的其他 PHP 脚本,或来自 的套接字对象socket.accept(),我想使用select.select()它,因为这是等待来自各种输入的最有效方式的来源。

我遇到的问题是,select.select()在 Windows 下不能使用子进程的标准输出文件描述符(这是记录在案的),看起来我将被迫:

  • A) 轮询 PHP 脚本以查看它们是否已将任何内容写入标准输出。(这个系统需要非常灵敏,我需要每秒至少轮询 1,000 次!)
  • B) 让 PHP 脚本连接到主进程并通过套接字而不是 stdout/stdin 进行通信。

我可能会选择解决方案(B),因为我不能让自己以如此高的频率进行系统轮询,但是当 stdout/stdin 做得很好时,重新连接套接字似乎是一种可悲的资源浪费。

是否有一些替代解决方案可以让我使用 stdout select.select()

0 投票
4 回答
16824 浏览

python - 如何在 Python commands.getstatusoutput() 中解释状态码

在一个相关问题中,我询问在哪里可以找到 C 函数“等待”的文档。这是试图找出 commands.getstatusoutput() 模块的返回码。Stackoverflow 通过了,但文档没有帮助。这让我感到困惑:

在 OS X (Leopard) 上运行时,我得到以下输出:(与文档匹配。)

在 OS X 上,执行“ls /fail ; echo $?” 得到以下输出:

在 Linux (Ubuntu Hardy) 上运行时,我得到以下输出:

在 Ubuntu 上,执行“ls /fail”会得到 2:

所以 Python 似乎将状态码乘以 256。嗯?这是在某处记录的吗?

0 投票
4 回答
3634 浏览

c++ - Boost中是否有跨平台执行?

我想在 C++ 中执行一个子进程。我需要它在 Windows 和 Linux 上工作。Boost中有这样的功能吗?这样做的标准方法是什么?

0 投票
2 回答
937 浏览

python - os.popen 子进程转换

这个片段让我得到了我的 BSD 网络接口的虚线四边形。我想弄清楚如何改用 subprocess 模块。

好像我不能以完全相同的方式使用子流程。我不认为我想要 shell=True 或 PIPE。我应该怎么做才能使输出可索引?

谢谢。

0 投票
11 回答
24822 浏览

python - 块 - 将输入发送到 python 子进程管道

我正在使用 python 测试子流程管道。我知道我可以直接在 python 中执行下面的程序,但这不是重点。我只想测试管道,所以我知道如何使用它。

我的系统是 Linux Ubuntu 9.04,默认 python 2.6。

我从这个文档示例开始。

这行得通,但由于p1'sstdin没有被重定向,我必须在终端中输入内容来馈送管道。当我输入^D关闭标准输入时,我得到了我想要的输出。

但是,我想使用 python 字符串变量将数据发送到管道。首先我尝试在标准输入上写:

没用。我尝试p2.stdout.read()在最后一行使用,但它也会阻塞。我添加了p1.stdin.flush()p1.stdin.close()但它也没有工作。我然后我开始交流:

所以还是不是这样。

我注意到运行单个进程(如p1上面,删除p2)可以完美运行。并且将文件句柄传递给p1( stdin=open(...)) 也可以。所以问题是:

是否可以在不阻塞的情况下将数据传递到 python 中的 2 个或多个子进程的管道?为什么不?

我知道我可以运行一个 shell 并在 shell 中运行管道,但这不是我想要的。


更新 1:按照下面 Aaron Digulla 的提示,我现在正在尝试使用线程来使其工作。

首先,我尝试在线程上运行 p1.communicate。

好吧,没用。尝试了其他组合,例如将其更改为.write()and p2.read()。没有什么。现在让我们尝试相反的方法:

代码最终在某处阻塞。在衍生线程中,或在主线程中,或两者兼而有之。所以它没有用。如果你知道如何让它工作,如果你能提供工作代码会更容易。我在这里试试。


更新 2

Paul Du Bois 在下面回答了一些信息,所以我做了更多的测试。我已经阅读了整个subprocess.py模块并了解了它的工作原理。因此,我尝试将其完全应用于代码。

我在 linux 上,但由于我正在使用线程进行测试,所以我的第一种方法是复制在subprocess.py'scommunicate()方法上看到的确切 Windows 线程代码,但是对于两个进程而不是一个进程。这是我尝试过的完整列表:

出色地。它没有用。即使在p1.stdin.close()被调用之后,p2.stdout.read()仍然会阻塞。

然后我尝试了posix代码subprocess.py

也阻止select.select(). 通过传播prints,我发现了这一点:

  • 阅读是有效的。代码在执行过程中多次读取。
  • 写作也在工作。数据写入p1.stdin.
  • 结束时numwritesp1.stdin.close()被调用。
  • select()开始阻塞时,只有to_read一些东西,p2.stdoutto_write已经是空的了。
  • os.read()call 总是返回一些东西,所以p2.stdout.close()永远不会被调用。

两个测试的结论:关闭stdin管道上的第一个进程(grep在示例中)不会使其将其缓冲输出转储到下一个进程并死掉。

没有办法让它工作?

PS:我不想使用临时文件,我已经用文件进行了测试,我知道它可以工作。而且我不想使用窗户。