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
python
subprocess
catatemypythoncode
la source
la source
os.sendfile()
-une solution basée sur est possible, voir Reproduire la commande unix cat en pythonRéponses:
MISE À JOUR: os.system est déconseillé, bien qu'il soit toujours disponible en Python 3.
Utilisez
os.system
:Si vous voulez vraiment utiliser un sous-processus, voici la solution (principalement tirée de la documentation pour le sous-processus):
OTOH, vous pouvez éviter complètement les appels système:
la source
os.system
et peut modéliseros.system
avec précision, mais elle est également plus complexe à utiliser.os.system
est venu avantsubprocess
. Le premier est une ancienne API que le second a l'intention de remplacer.os.system()
oushell=True
. Pour rediriger la sortie d'un sous-processus, utilisez lestdout
paramètre comme indiqué dans la réponse de Ryan Thompson . Bien que vous n'ayez pas besoin d'un sous-processus (cat
) dans votre cas, vous pouvez concaténer des fichiers en utilisant du Python pur.Dans Python 3.5+ pour rediriger la sortie, passez simplement un handle de fichier ouvert pour l'
stdout
argument àsubprocess.run
:Comme d'autres l'ont souligné, l'utilisation d'une commande externe comme
cat
celle-ci est totalement étrangère.la source
subprocess.run(my_cmd, stdout=outfile)
qui remplacesubprocess.call(...)
Bien sûr:
la source
Lorsque vous utilisez un sous - processus , le processus doit être tué.C'est un exemple.Si vous ne tuez pas le processus, le fichier sera vide et vous ne pourrez rien lire.Il peut fonctionner sous Windows.Je ne peux pas m'assurer qu'il peut fonctionne sous Unix.
la source
for line in .readlines():
,s +=
) etproc.kill()
peut entraîner une perte d'information en général (il ne permet pas de mettre fin à la sous - processus gracieusement (sous Unix) - contenu unflushed est perdu ). Quoi qu'il en soit, la note sur la mise en mémoire tampon est plus appropriée comme commentaire.shlex.split()
, goutteshell=True
, goutte>file
, goutteopen()
, etc et de l' utilisationstdout=PIPE
,Timer(1, proc.terminate).start()
;output = proc.communicate()[0]
au lieu. Voici un exemple complet . Plus de solutions: arrêter de lire la sortie du processus en Python sans se bloquer? Remarque: il n'y a aucune exigence dans la question que vous deviez terminer le processus enfant manuellement - vous pouvez résoudre d'autres problèmes, par exemple, un processus peut se comporter différemment si son stdout est un tty mais il est hors sujet.Un cas intéressant serait de mettre à jour un fichier en y ajoutant un fichier similaire. Ensuite, on n'aurait pas à créer un nouveau fichier dans le processus. Il est particulièrement utile dans le cas où un fichier volumineux doit être ajouté. Voici une possibilité d'utiliser la ligne de commande teminal directement à partir de python.
la source