130 votes

Comment rediriger la sortie avec un sous-processus en Python ?

Ce que je fais dans la ligne de commande :

cat file1 file2 file3 > myfile

Ce que je veux faire avec python :

import subprocess, shlex
my_cmd = 'cat file1 file2 file3 > myfile'
args = shlex.split(my_cmd)
subprocess.call(args) # spits the output in the window i call my python program

359voto

Ryan Thompson Points 7501

Sur Python 3.5 et plus pour rediriger la sortie, il suffit de passer un handle de fichier ouvert pour l'option stdout argument pour subprocess.run :

# Use a list of args instead of a string
input_files = ['file1', 'file2', 'file3']
my_cmd = ['cat'] + input_files
with open('myfile', "w") as outfile:
    subprocess.run(my_cmd, stdout=outfile)

Comme d'autres l'ont souligné, l'utilisation d'une commande externe comme cat dans ce but est complètement étrangère.

17voto

Marcelo Cantos Points 91211

MISE À JOUR : os.system est déconseillé, bien que toujours disponible dans Python 3.


Utilisez os.system :

os.system(my_cmd)

Si vous voulez vraiment utiliser subprocess, voici la solution (reprise en grande partie de la documentation de subprocess) :

p = subprocess.Popen(my_cmd, shell=True)
os.waitpid(p.pid, 0)

En revanche, vous pouvez éviter complètement les appels système :

import shutil

with open('myfile', 'w') as outfile:
    for infile in ('file1', 'file2', 'file3'):
        shutil.copyfileobj(open(infile), outfile)

5voto

IfLoop Points 59461

@PoltoS Je veux joindre des fichiers et ensuite traiter le fichier résultant. Je pensais qu'utiliser cat était la solution la plus simple. Existe-t-il une meilleure façon de le faire ?

Bien sûr :

with open('myfile', 'w') as outfile:
    for infilename in ['file1', 'file2', 'file3']:
        with open(infilename) as infile:
            outfile.write(infile.read())

2voto

wyx Points 746
size = 'ffprobe -v error -show_entries format=size -of default=noprint_wrappers=1:nokey=1 dump.mp4 > file'
proc = subprocess.Popen(shlex.split(size), shell=True)
time.sleep(1)
proc.terminate() #proc.kill() modify it by a suggestion
size = ""
with open('file', 'r') as infile:
    for line in infile.readlines():
        size += line.strip()

print(size)
os.remove('file')

Lorsque vous utilisez sous-processus le processus doit être tué. C'est un exemple. Si vous ne tuez pas le processus.., fichier sera vide et vous ne pourrez rien lire. Il peut fonctionner sur Windows Je ne peux pas m'assurer qu'il peut fonctionner sous Unix.

1voto

DJJ Points 149

Un cas intéressant serait de mettre à jour un fichier en y ajoutant un fichier similaire. Ainsi, il ne serait pas nécessaire de créer un nouveau fichier dans le processus. C'est particulièrement utile dans le cas où un grand fichier doit être ajouté. Voici une possibilité en utilisant la ligne de commande teminal directement depuis python.

import subprocess32 as sub

with open("A.csv","a") as f:
    f.flush()
    sub.Popen(["cat","temp.csv"],stdout=f)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X