从os.system切换到Popen以生成交互式shell的正确方法是什么?

时间:2014-01-31 14:17:36

标签: python shell

我试图在我的python代码中删除os.system,大部分都已完成,但我有一行我似乎无法转换。

os.system('/bin/sh -i -c "/bin/runner catch exts"')

到目前为止,事情已经尝试过:

p = subprocess.Popen(['/bin/sh', '-i', '-c', '/bin/runner catch exts'])

返回:

/bin/sh: 1: Cannot set tty process group (No such process)

编辑:

我没有运行我的自定义跑步者,而是用“ls”尝试了这个,我仍然得到同样的错误。

os.system('/bin/sh -i -c "ls"') # works fine

现在尝试转换 -

p = subprocess.Popen(['/bin/sh', '-i', '-c', 'ls']) # Doesn't work

返回:

/bin/sh: 1: Cannot set tty process group (No such process)

尝试(这应该不起作用,但是用户在评论中建议):

p = subprocess.Popen('/bin/sh -i -c "ls"')

返回:

OSError: [Errno 2] No such file or directory

2 个答案:

答案 0 :(得分:0)

Popen无法使用交互式shell。 subprocess模块旨在让您完全控制子进程的stdin和stdout,以便与之交谈。

另一方面,交互式shell需要一个tty(一个终端),Python应该单独留下它的I / O流。对于此用例,您可以尝试使用pty模块,也可以使用os.system()

答案 1 :(得分:0)

您应该使用subprocess.call()而不是subprocess.Popen()。 Popen使你的子进程'stdin成为一个管道,但是sh -i想要将它的stdin用作tty。