gpt4 book ai didi

python - subprocess.Popen() 管道问题

转载 作者:太空宇宙 更新时间:2023-11-04 12:33:06 27 4
gpt4 key购买 nike

关于先前的部分解决的问题(Python issue running subprocess.Popen() from a .py in console)。我仍然发现一些我无法解决的错误。

代码的重要部分如下:

proc = subprocess.Popen(['/bin/bash','-c', '-i', 'which conda'], stdout=subprocess.PIPE)
conda_location = proc.stdout.read().decode('ascii')
conda_location = conda_location[:-1]
print('ANACONDA LOCATION: ', conda_location)

#some stuff

print('Checking presence of HOMER files...')
proc = subprocess.Popen(['/bin/bash', '-c', '-i', 'which findMotifs.pl'], stdout=subprocess.PIPE)
p = proc.stdout.read().decode('ascii')
p = p[:-1]

#more stuff

如果我在 PyCharm IDE 控制台中运行此代码,它可以毫无问题地运行。但是,如果我在 Linux 终端中运行它,会发生以下情况:

现在,如果我切换进程,第二个进程(现在是第一个)运行,第一个进程(现在是第二个)停止。此外,如果我独立运行每个进程,它们工作正常。

这个发现让我认为第一个进程很可能正在等待,而第二个进程停止了。但是,当我运行 proc.wait()proc.kill()proc.terminate() 时,没有任何操作使第二个功能正常工作,但仍然停止。

我也尝试过添加 .communicate()shell=True,但无济于事。

提前致谢

最佳答案

这实际上不是 Python 问题,而是 bash 问题。

给 bash -i(交互)标志告诉 bash 它是交互的,即它应该从 stdin 读取输入并执行输入的任何命令。 (当然,首先它会运行你给它的 -c 命令——但是之后....)

Bash 的标准输入与 Python 的标准输入相同,因为您没有重定向它。所以 bash 尝试从 stdin 读取。就其本身而言,这并没有那么糟糕——但 bash 也有作业控制,这意味着它必须接管进程、进程组等的分配,以确保只有 一个管道 (prog1 | prog2 | prog3) 一次 可以从终端读取。因此,Bash 试图从您的 Python session 中夺取终端的控制权,您的外部 shell 将控制权传递给该 Python session 。

结果是 SIGTTINSIGTTOUSIGTSTP 信号(细节因操作系统而异;看起来 Linux 给了你一个 SIGTSTP 但我的 BSD 实验得到了一个 SIGTTIN;有关这些的更多信息,请参阅 http://curiousthing.org/sigttin-sigttou-deep-dive-linux)和普遍的不良行为,因为各种进程会争夺允许谁在 session 中做什么、何时做什么。

最简单的解决方法与之前告诉您的一样:删除 -i 标志。

如果 -i 使程序可查找,而在其他情况下不可可查找,则说明您的环境配置不正确,例如,通过设置 PATH 仅在 ~/.bashrc 中,即使 bash 不是您的主要 shell(您的 PATH 设置应该在 ~/.profile 如果你的主 shell 是 sh)。

关于python - subprocess.Popen() 管道问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42748570/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com