【发布时间】:2017-07-28 00:51:37
【问题描述】:
我正在运行一个程序,它使用 subprocess.Popen() 来完成一些任务(我不能为它们使用 os.system())。当我从控制台运行它时,在 IDE 中正确运行的程序(我稍后会解释)会停止,尽管我可以通过在控制台中写入 fg 来恢复它。
代码如下(这是一段代码,完整代码实现了类似的任务,出现同样的问题)...
import subprocess
p,o = subprocess.Popen(['/bin/bash', '-c', '-i', 'which python3.5'], stdout=subprocess.PIPE).communicate()
p = p.decode('ascii')
print(p)
print('Installing pysamstats...')
subprocess.Popen(['/bin/bash', '-c', '-i', 'conda install -y -c bioconda pysamstats']).communicate()
print('OK')
如果代码是从 IDE 运行的(我使用 PyCharm 和 anaconda 作为解释器),则会出现输出并且所有脚本都可以顺利运行,但每次调用 Popen 时都会出现以下消息...
bash: cannot set terminal process group (3556): Inappropriate ioctl for device
bash: no job control in this shell
正如我所说的,除了“错误”之外,代码是正确执行的。
但是,如果我从控制台运行 .py 文件...
python3 '/DIRTOFILE/ZZZ.py'
出现以下消息...
/home/labcombio1/anaconda3/bin/python3.5
Installing pysamstats...
[1]+ Stopped python3 '/media/labcombio1/ZZZ.py'
即执行第一个命令,并正确打印输出,而停止第二个命令。如果我用fg 恢复命令,它工作正常。如果第一个 Popen 命令没有运行,也就是只运行第二个,也会发生同样的情况。
我试过shell=True,删除.communicate(),添加stdout=subprocess.PIPE,但这些都不能解决控制台上的“已停止”行。其他命令产生相同的结果。
最后,我尝试运行以下命令:
subprocess.Popen('conda install -y -c bioconda pysamstats', shell=True).communicate()
subprocess.Popen(['/bin/bash', '-c', 'conda install -y -c bioconda pysamstats']).communicate()
虽然它们都在 Pycharm 中正常工作(它们甚至不提示 bash: cannot set terminal process group (3556): Inappropriate ioctl for device),但终端仍然失败,并显示以下消息:
/bin/sh: 1: conda: not found
我对子流程模块知之甚少,尽管阅读了其他问题和一些关于它的页面,但我一直无法解决这个问题。
提前谢谢你
【问题讨论】:
标签: bash python-3.x shell subprocess popen