CompletedProcess de sous-processus.run() ne retourne pas une chaîne
Selon la Python 3.5 docs, sous-processus.run() retourne un un CompletedProcess objet avec un stdout membre qui contient "Une séquence d'octets, ou une chaîne run() a été appelé avec universal_newlines=True." Je suis le seul à voir une séquence d'octets et non pas une chaîne, qui j'ai été en supposant (espérant) serait équivalent à une ligne de texte. Par exemple,
import pprint
import subprocess
my_data = ""
line_count = 0
proc = subprocess.run(
args = [ 'cat', 'input.txt' ],
universal_newlines = True,
stdout = subprocess.PIPE)
for text_line in proc.stdout:
my_data += text_line
line_count += 1
word_file = open('output.txt', 'w')
pprint.pprint(my_data, word_file)
pprint.pprint(line_count, word_file)
Remarque: il utilise une nouvelle fonction en Python 3.5 qui ne fonctionne pas dans les versions précédentes.
Dois-je créer ma propre ligne de mise en mémoire tampon de la logique, ou est-il un moyen d'obtenir Python de le faire pour moi?
Cela n'a pas fonctionner pour moi (3,4) -- qui est attendu?
Je suis l'aide de 3.5. Je vais le rendre plus clair.
Êtes-vous sûr que vous êtes l'obtention d'une séquence d'octets? Vous pouvez
Merci. Le chaînage de split() de proc.stdout était ce que je cherchais.
Je suis l'aide de 3.5. Je vais le rendre plus clair.
Êtes-vous sûr que vous êtes l'obtention d'une séquence d'octets? Vous pouvez
print type(proc.stdout)
ou quelque chose à vérifier. Vous êtes une itération sur proc.stdout
comme si c'est un fichier. L'itération sur un fichier texte vous donne chaque ligne. Une itération sur une chaîne de caractères ou d'octets de la séquence de vous donner chaque personnage/octet. Si vous souhaitez gérer chaque ligne d'une chaîne individuellement, vous pouvez effectuer une itération sur proc.stdout.split('\n')
à la place. (Bien que cela ne comprend pas les retours à la ligne à chaque ligne comme une itération sur un dossier.)Merci. Le chaînage de split() de proc.stdout était ce que je cherchais.
OriginalL'auteur highpost | 2015-12-04
Vous devez vous connecter pour publier un commentaire.
proc.stdout
est déjà une chaîne de caractères dans votre cas, exécutezprint(type(proc.stdout))
, pour s'en assurer. Il contient tous les sous-processus de sortie --subprocess.run()
ne pas revenir jusqu'à ce que le processus enfant est mort.for text_line in proc.stdout:
est incorrect:for char in text_string
énumère les caractères (Unicode codepoints) en Python, et non de lignes. Pour obtenir des lignes, composez le:Le résultat peut être différent de
.split('\n')
si il y a de l'Unicode des retours à la ligne dans la chaîne.Si vous voulez lire la ligne de sortie par ligne (pour éviter de manquer de mémoire pour longtemps-processus en cours d'exécution):
Remarque:
process.stdout
est un fichier comme objet dans ce cas.Popen()
ne pas attendre la fin du processus --Popen()
retourne immidiately l'enfant dès qu'il est lancé.process
est unsubprocess.Popen
exemple, pasCompletedProcess
ici.Si vous avez besoin de compter le nombre de lignes (fin en
b'\n'
) dans la sortie, commewc -l
:Voir Pourquoi la lecture des lignes à partir de stdin beaucoup plus lent en C++ que Python?
OriginalL'auteur jfs
si vous avez besoin d'avoir la sortie standard les lignes dans un tableau afin de mieux les manipuler vous tout simplement manquer de diviser la production par l'Universel "saut de ligne" séparateurs
de sortie est:
OriginalL'auteur Gianfranco
Vous voyez une chaîne de caractères, de comparer:
classe 'octets'
exécuter des appels popen.communiquer
Ont un look ici pour plus d'explication et d'autres shell interactions.
OriginalL'auteur fiacre