我正在运行一个使用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运行的(我使用带有anaconda的PyCharm作为解释器),则会发生输出并且所有脚本都会顺利运行,但每次调用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命令没有运行,也就是说只有第二个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
我对子进程模块知之甚少,尽管阅读了其他问题和一些页面,但我一直无法解决这个问题。
提前谢谢
答案 0 :(得分:0)
第一个问题:
bash: cannot set terminal process group (3556): Inappropriate ioctl for device
bash: no job control in this shell
从-i
解释器中删除bash
标记。
-i如果存在-i选项,则shell是交互式的。
示例:
p, o = subprocess.Popen(['/bin/bash', '-c', 'which python3.5'], stdout=subprocess.PIPE).communicate()
第二期:
/bin/sh: 1: conda: not found
您的环境中不会导出conda
路径。
可能的解决方案
1)将其加载到IDE中。
2)使用可执行文件的完整路径。
subprocess.Popen(['/path/to/conda/conda', 'install', '-y', '-c', 'bioconda', 'pysamstats']).communicate()
3)将env
传递给Popen
。
subprocess.Popen(['conda', 'install', '-y', '-c', 'bioconda', 'pysamstats'], env={"PATH": "/path/to/conda"}).communicate()