Python问题从控制台

时间:2017-03-07 17:34:59

标签: bash python-3.x shell subprocess popen

我正在运行一个使用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

我对子进程模块知之甚少,尽管阅读了其他问题和一些页面,但我一直无法解决这个问题。

提前谢谢

1 个答案:

答案 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()