问题标签 [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 投票
5 回答
9797 浏览

python - Windows 上的 Python 2.6:如何使用“shell=True”参数终止 subprocess.Popen?

有没有办法终止以 subprocess.Popen 类启动的进程,其中“shell”参数设置为“True”?在下面的最小工作示例中(使用 wxPython),您可以愉快地打开和终止记事本进程,但是如果您将 Popen“shell”参数更改为“True”,则记事本进程不会终止。

为了这个问题,请接受“shell”确实必须等于“True”。

0 投票
2 回答
3644 浏览

python - 如何在循环中打印对 subprocess.Popen(...) 的调用的输出?

我编写了一个脚本来运行具有不同输入参数的命令行程序,并从输出中获取特定的行。我有以下循环运行:

一个问题是循环运行完成后只有输出。我想在每次进程完成时打印一些东西。我怎样才能做到这一点?

另外,我希望可以选择显示 p1 的输出。但是我不能在不破坏 p2 的情况下用 p1.stdout.readlines() 抓住它。我怎样才能做到这一点?

我在想我不能调用 grep,存储 p1 的输出并搜索短语,但是有很多输出,所以这种方式似乎效率很低。

任何建议将不胜感激。谢谢!

0 投票
4 回答
3515 浏览

python - Python 的 subprocess.Popen 返回相同的标准输出,即使它不应该

我对 Python 的 subprocess.Popen 有一个非常奇怪的问题。我正在使用它多次调用外部 exe 并将输出保存在列表中。

每次调用这个外部 exe 时,它​​都会返回一个不同的字符串。但是,如果我使用 Popen 多次调用它,它总是会返回 SAME string。=:-O

看起来 Popen 总是从标准输出返回相同的值,而无需调用 exe。也许在不实际再次调用 exe 的情况下进行某种缓存。

这是我的代码:

我到底做错了什么?!

0 投票
2 回答
2890 浏览

python - 使用标准输入管道控制 Windows 控制台应用程序

我正在尝试使用 subprocess 模块从 Python 控制控制台应用程序(Segger 的 JTAG 应用程序)。应用程序在标准输出上表现正确,但似乎没有读取标准输入。如果启用 shell,我可以输入输入并控制应用程序,但我需要以编程方式执行此操作。相同的代码适用于向 cmd.exe 之类的命令发出命令。

我猜是直接读取键盘而不是标准输入。有什么想法可以发送应用程序输入吗?

0 投票
3 回答
1140 浏览

python - 您如何自动化大型项目的启动/调试?

设想:

有一个复杂的软件,手动启动很烦人。我所做的是创建一个 python 脚本来启动可执行文件并附加gdb进行调试。

进程启动脚本:

  • 确保设置了环境变量。
  • 确保将本地构建目录添加到环境LD_LIBRARY_PATH变量中。
  • 将当前工作目录更改为可执行文件期望的位置(不是我的设计)
  • 使用配置文件启动可执行文件是唯一的命令行选项
  • 将可执行文件的输出通过管道传输到第二个日志记录进程
  • 记住可执行文件的 PID,然后启动并将 gdb 附加到正在运行的可执行文件。

该脚本有效,但有一个警告。ctrl-c 不会中断被调试者并将控制权返回给 gdb。因此,如果我在没有活动断点的情况下“继续”,我将永远无法再次停止该进程,它必须被另一个 shell 杀死/中断。顺便说一句,运行“kill -s SIGINT <pid>”,其中 <pid> 是被调试者的 pid,确实让我回到了 gdb 的提示符......但是必须以这种方式做事真的很烦人

起初我以为 Python 正在抓取 SIGINT 信号,但情况似乎并非如此,因为我设置了信号处理程序将信号转发给被调试者,但这并不能解决问题。

我已经尝试了对 python 脚本的各种配置(调用 os.spawn* 而不是子进程等)。似乎无论我怎么做,如果 python 启动子进程,SIGINT (ctrl-c) 信号不要路由到 gdb 或子进程。

目前的思路

  • 这可能与被调试者和 gdb 需要一个单独的进程组 ID 相关......对此有任何信任吗?
  • SELinux 可能的错误?

信息:

  • 数据库 6.8
  • Python 2.5.2(Python 2.6.1 也存在问题)
  • SELinux 环境(向进程传递信号的错误?)

我考虑过的替代方案:

  • 设置一个 .gdbinit 文件来完成脚本所做的工作、环境变量和当前工作目录是这种方法的一个问题。
  • 手动启动可执行文件并附加 gdb (yuck)

问题: 您如何自动化大型项目的启动/调试?

更新: 我在下面尝试了 Nicholas Riley 的示例,在我家里的 Macintosh 上,它们都允许 cntl-c 以不同的程度工作,在生产 boxen(我现在相信它可能正在运行 SELinux)上它们不...

0 投票
4 回答
5826 浏览

python - 子进程在 Python 中检测父进程的死亡

Python中的子进程有没有办法检测父进程是否已经死亡?

0 投票
4 回答
1246 浏览

python - 子进程中的“shell”参数在 Windows 上是什么意思?

子进程模块的文档声明“如果shell为 True,则将通过 shell 执行指定的命令”。在 Windows 操作系统上,这在实践中意味着什么?

0 投票
5 回答
19249 浏览

python - Python子进程“对象没有属性'fileno'”错误

此代码在使用 Python 2.5.1 运行时生成“AttributeError:'Popen' 对象没有属性 'fileno'”

代码:

堆:

此代码应该在 python 文档中描述此用法

0 投票
20 回答
140900 浏览

python - 使用子进程获取实时输出

我正在尝试为命令行程序(svnadmin verify)编写一个包装脚本,它将显示一个很好的操作进度指示器。这要求我能够在输出后立即看到包装程序的每一行输出。

我想我只需使用subprocess.Popen, use来执行程序stdout=PIPE,然后读取每一行,并据此采取行动。但是,当我运行以下代码时,输​​出似乎被缓冲在某处,导致它出现在两个块中,第 1 行到第 332 行,然后是第 333 到 439 行(输出的最后一行)

在看了一些关于 subprocess 的文档之后,我发现了bufsizeto 的参数Popen,所以我尝试将 bufsize 设置为 1(每行缓冲)和 0(无缓冲),但是这两个值似乎都没有改变传递行的方式。

在这一点上,我开始抓住稻草,所以我编写了以下输出循环:

但得到了相同的结果。

是否可以获得使用子进程执行的程序的“实时”程序输出?Python 中是否还有其他向前兼容的选项(不是exec*)?

0 投票
10 回答
36425 浏览

python - 当多个参数包含空格时如何使用子进程?

我正在开发一个包装脚本,它将运行一个 vmware 可执行文件,允许虚拟机启动/关闭/注册/注销操作的自动化。我正在尝试使用子进程来处理调用可执行文件,但是子进程未正确处理可执行文件路径和可执行文件参数中的空格。下面是一个代码片段:

如果我调用 vm_list2 函数,我会得到以下输出:

如果我调用需要 path-to-vm 参数的 vm_start 函数,我会得到以下输出:

显然,带有嵌入空格的第二个参数的存在正在改变子进程解释第一个参数的方式。关于如何解决这个问题的任何建议?

python2.5.2/cygwin/winxp