Python—使用os.popen()解析Unix;ls";-杀子进程的问题

Python—使用os.popen()解析Unix;ls";-杀子进程的问题,python,c,linux,centos,ctrl,Python,C,Linux,Centos,Ctrl,据我所知,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程序本身 我用谷歌搜索了一下,似乎找不到正确的答案。有些人建议

据我所知,
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程序本身

我用谷歌搜索了一下,似乎找不到正确的答案。有些人建议使用信号(我试过了…它不起作用)。另一个试图使用PIDs并杀死儿童PIDs,但我似乎无法得到它


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

行为是正确的。Ctrl+C停止前台进程,而不是其父进程。调用shell并使用
ls
在这里是不合适的,您的代码最好按以下方式编写(未经测试):


这种行为是正确的。Ctrl+C停止前台进程,而不是其父进程。调用shell并使用
ls
在这里是不合适的,您的代码最好按以下方式编写(未经测试):


我看到一些正确的答案被推荐,OP在评论中说

我得到了这个错误: AttributeError:“模块”对象没有 属性“检查调用”

根据我刚刚链接到的文档,
check\u call
标记为:

版本2.5中的新功能

因此,OP似乎使用了一些古老的Python版本——2.4或更早版本——而没有提及这一事实(当前的产品就绪版本是2.7,2.4已经有很多年了)


因此,最好的建议是升级!如果2.7对于您的口味来说“太新了”(可能在保守的“商店”中被认为),那么2.6的最新微发行版至少应该是好的——它不仅会给您提供
子流程。请检查\u call
,还有许多额外的注意事项、错误修复和优化!)

我看到一些正确的答案被推荐,OP在评论中说

我得到了这个错误: AttributeError:“模块”对象没有 属性“检查调用”

根据我刚刚链接到的文档,
check\u call
标记为:

版本2.5中的新功能

因此,OP似乎使用了一些古老的Python版本——2.4或更早版本——而没有提及这一事实(当前的产品就绪版本是2.7,2.4已经有很多年了)


因此,最好的建议是升级!如果2.7对于您的口味来说“太新了”(可能在保守的“商店”中被认为),那么2.6的最新微发行版至少应该是好的——它不仅会给您提供
子流程。请检查\u call
,还有许多额外的注意事项、错误修复和优化!)

一,。永远不要分析
ls
的输出。2.使用
子流程
模块而不是
os.popen
@user402642,原因如下:非常感谢!我以后肯定不会解析ls:D1。永远不要分析
ls
的输出。2.使用
子流程
模块而不是
os.popen
@user402642,原因如下:非常感谢!我以后肯定不会解析ls:DThanks!我尝试调用subprocess.check_call,但现在我遇到了以下错误:AttributeError:“module”对象没有属性“check_call”,我尝试用谷歌搜索结果,但没有结果。>>>>对于os.listdir(os.Environment['PSIM_DATA'])中的fname:
。。。path=os.path.join(os.environ['PSIM_DATA'],fname)
。。。子进程。check_调用([“echo”,path])


给我错误谢谢您的回复!我尝试调用subprocess.check_call,但现在我遇到了以下错误:AttributeError:“module”对象没有属性“check_call”,我尝试用谷歌搜索结果,但没有结果。>>>>对于os.listdir(os.Environment['PSIM_DATA'])中的fname:
。。。path=os.path.join(os.environ['PSIM_DATA'],fname)
。。。子进程.check_调用([“echo”,path])


给出了错误
import os
import subprocess
for fname in os.listdir(directory):
    path = os.path.join(directory, fname)
    subprocess.check_call(["./processFile", path])