Python:回显子进程

标签 python subprocess echo qsub

我正在尝试从 python 脚本将任务分配给 qsub。

到目前为止,我一直使用这样的表达式来进行 qsub 提交:

echo "python script.py arg1 arg2" | qsub

我尝试在 python 中重现此命令:

command = 'echo "python sub_master_script.py ' + str(i) + ' ' + path + '" | qsub -pe make 5 -N Teaching_' + str(i) + ' -cwd'
subprocess.call(shlex.split(command))

虽然 command 带有我通常使用的命令,但当我启动 python 脚本时,它被解释为简单的 echo

我没有开始一项新工作,而是在控制台中编写了以下内容:

python sub_master_script.py 0.75 /data5/bio/runs-galkin/Iterative/test_OTU.txt | qsub -pe make 5 -N Teaching_0.75 -cwd

为什么会发生这种情况?我怎样才能让它发挥作用?

最佳答案

您正在大量使用 shell 功能,主要是通过管道连接在一起运行 2 个进程。

subprocess.call(shlex.split(command),shell=True)

是一个快速修复。

正确的做法是使用 1 subprocess.Popen 实例,通过 communicate 提供输入(以模拟 echo python ...)并删除 shell=True (使用 pipes.quote 正如 Charles 评论的那样,以确保在需要时正确引用字符串)

import pipes
input_string = "python sub_master_script.py {} {}\n".format(*(map(pipes.quote,[str(i),path])))

p = subprocess.Popen(['qsub','-pe','make','5','-N','Teaching_{}'.format(i),'-cwd'],stdin=subprocess.PIPE)
out,err = p.communicate(input_string)

关于Python:回显子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42139268/

相关文章:

python - 将列表 A 中的项目追加到列表 B(如果列表 B 中尚未包含这些项目)

python - 如何在 python/matplotlib 中制作居中气泡图

javascript - 使用 BeautifulSoup 解析 Javascript 按钮元素中的 HTML

python read() from stdout 比逐行读取慢得多(吞咽?)

python - 线程子进程的奇怪输出

php - 带有 2 个 <td> 的表中的样式 1 <td>

git - Bash 脚本打印到程序提示符

python - 在 Python 中播放期间更改音频的音高(和速度)

python - 在 cmd 中通过 Python 运行工具不等待

php - 无法回显变量,但我可以使用并回显其他字符串