0

据我了解,os.popen()在 Python 中打开一个管道并启动一个新的子进程。当我与 os.popen() 一起运行 for 循环时遇到问题。我似乎无法 CTRL+C 退出循环。这是我的代码:

for FILE in os.popen("ls $MY_DIR/"):
    os.system("./processFile " + FILE)

每当我尝试时CTRL+C,Python 都会停止./processFile程序,但不会停止 python 程序本身!

我用谷歌搜索了一下,似乎找不到正确的答案。有些人建议使用 SIGNALS(我试过......它没有用)。另一个尝试使用 PID 并杀死子 PID,但我似乎无法理解。

有人可以带我举一个更好的例子,这样我就可以在使用CTRL+C(SIGINT) 时停止编程吗?

4

2 回答 2

3

我看到一些答案正确推荐subprocess.check_call和评论中的 OP 说

我收到此错误:AttributeError: 'module' object has no attribute 'check_call'

根据我刚刚链接到的文档,check_call标记为:

2.5 版中的新功能。

所以看起来 OP 正在使用一些古老的 Python 版本——2.4 或更早版本——而没有提及这一事实(当前的生产就绪版本是 2.7,而 2.4 已经有很多年了)。

因此,最好的推荐是升级!如果 2.7 对你的口味来说“太新”(因为它可能在保守的“商店”中被认为是),那么 2.6 的最新微版本至少应该没问题——它不仅会给你subprocess.check_call,还会给你很多额外的功能,错误修复和优化!-)

于 2010-07-26T19:53:59.143 回答
2

行为是正确的。Ctrl+C 停止前台进程而不是其父进程。这里调用shell和使用ls是不合适的,你的代码最好写成如下(未经测试):

import os
import subprocess
for fname in os.listdir(directory):
    path = os.path.join(directory, fname)
    subprocess.check_call(["./processFile", path])
于 2010-07-26T19:13:38.503 回答