检查子进程python3的输出

时间:2017-07-21 10:55:28

标签: python python-3.x subprocess

嘿我正在更新我的脚本,我现在已经将os更改为子进程,但我不知道如何检查输出?我想检查它是空的还是它的内容。脚本只是执行其他程序或句子列表。

"""
Created on Sun Jan  8 18:52:57 2017

@author: MarcGrad
"""
import sys
import subprocess


syntax = '''
------------------------------------------------------------------------------------
Syntax:        python find_by_sentence.py *file1.txt
*List of sentences (column of) 
------------------------------------------------------------------------------------
'''
if len(sys.argv) != 1:
        print(syntax)
        sys.exit()

open_file = open(sys.argv[1],'r')

list_of_sentences = []

for sent in open_file:
    list_of_sentences.append(sent.rstrip())
counter = 0
for word in list_of_sentences:
    counter += 1
    print(counter,word)
    subprocess.check_output("esearch -db protein -query %s | efetch -format fasta >> results_seq.txt" % (word), shell = True)

print('done :)')    
open_file.close()

1 个答案:

答案 0 :(得分:1)

当你启动一个过程时,它会自动打开3个文件描述符(你可以在单向通信通道上看它):

  • STDIN - 用于来自用户的输入(例如,在输入密码到SSH时使用)
  • STDOUT - 用作应用程序标准输出的文本(例如在控制台上打印消息的频道)
  • STDERR - 与STDOUT相同,但用于错误消息。

您可以将输出(也是输入,但不适用于您的问题)重定向到文件(换句话说,您“断开”控制台并“连接”文件)。对于重定向,请指定这些符号:>>>(有关详细信息,请查看https://unix.stackexchange.com/questions/171025/what-does-do-vs)。命令ls -l >> file.txt将写出ls -l的输出并在控制台上写任何内容(因为它是“断开连接”)

result = subprocess.check_output(...)接受命令并将其STDOUT“连接”到result变量中。但是您正在运行此命令:esearch -db protein -query %s | efetch -format fasta >> results_seq.txt如果您查看结尾,则会看到>> results_seq.txt。因此,您的命令输出已“连接”到文件results_seq.txt中,无法保存在result变量中。

现在您可以使用这些方法:

  1. 按原样运行命令,然后打开文件results_seq.txt并查看内容

    subprocess.check_output("esearch -db protein -query %s | efetch -format fasta >> results_seq.txt" % (word), shell = True)
    with open("results_seq.txt", "r") as f:
         result = f.read()
    
  2. 不要在命令中使用重定向并将其保存在Python中:

    result = subprocess.check_output("esearch -db protein -query %s | efetch -format fasta" % (word), shell = True)
    with open("results_seq.txt", "wb") as f:
         f.write(result)
    
  3. 使用tee实用程序允许将输出重定向到文件并将其保留在控制台上

    result = subprocess.check_output("esearch -db protein -query %s | efetch -format fasta | tee -a results_seq.txt" % (word), shell = True)
    
  4. 在任何这些示例的末尾,您将保存保存在变量result

    中的命令输出