【问题标题】:Python issue running subprocess.Popen() from a .py in consolePython 问题从控制台中的 .py 运行 subprocess.Popen()
【发布时间】: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


    【解决方案1】:

    第一个问题

    bash: cannot set terminal process group (3556): Inappropriate ioctl for device
    bash: no job control in this shell
    

    bashinterpreter 中删除-i 标志。

    -i 如果存在 -i 选项,则 shell 是交互式的。

    例子:

    p, o = subprocess.Popen(['/bin/bash', '-c', 'which python3.5'], stdout=subprocess.PIPE).communicate()
    

    第二期:

    /bin/sh: 1: conda: not found
    

    condapath 未在您的环境中导出。

    可能的解决方案

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

    【讨论】:

    • 正如我在问题中所说,这样做问题仍然存在,它会在终端中抛出消息:“/bin/sh: 1: conda: not found”。
    • 您好,您提到的建议在一定程度上奏效了。现在的问题是,如果我需要再次调用 subprocess.Popen,它也会停止。看起来好像进程没有完全终止,它被停止或什么的。
    猜你喜欢
    • 2011-05-13
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多