2009-12-08 7 views
2
#!/usr/bin/env python 
import os, sys, subprocess, time 
while True:  
    print subprocess.call("xsel", shell=True); 
    time.sleep(1); 

Prend une entrée du presse-papiers et l'imprime, toutes les secondes.Supprime le 0 final d'une chaîne python

Résultat:

copied0 
entry0 
from0 
clipboard0 

Je ne sais pas pourquoi il retourne la finale 0, mais il me arrête apparemment d'utiliser la bande string (int a bande non), d'où le 0 fait la chaîne un entier?

Comment peut-on enlever le 0 final de la chaîne python dans le résultat ci-dessus? Je suis un scripteur BASH qui convertit en python.

Répondre

4

Comme Mark a fait remarquer, subprocess.call() ne fait pas ce que vous voulez

Quelque chose comme cela devrait fonctionner

#!/usr/bin/env python 
import os, sys, subprocess, time 
while True: 
    p=subprocess.Popen(["xsel"],stdout=subprocess.PIPE) 
    print p.stdout.read() 
    time.sleep(1) 
+0

Merci XD - donc je dois utiliser un sous-processus différent. – torger

+0

Et nous avons du succès: print subprocess.Popen (["xsel"], stdout = subprocess.PIPE) .stdout.read() – torger

+0

Je suppose que vous avez dû être capable d'attraper la sortie de xsel, et pas seulement l'imprimer au terminal –

2

"copied0".rstrip("0") devrait fonctionner

En fait, vous feriez mieux de faire comme ça, il montre coutume code de retour à l'écran

import os, sys, subprocess, time 
while True:  
    _ = subprocess.call("dir", shell=True); 
    time.sleep(1); 
+0

Je dois dépouiller itérativement comme ci-dessus. J'ai créé ceci à partir de votre message: entry = subprocess.call ("xsel", shell = True); \t print "entry" .rstrip ("0entry") - semble fonctionner mais n'est pas très élégant. – torger

+0

Essayé que - AttributeError: objet 'int' n'a pas d'attribut 'rstrip' - la raison de la question. – torger

+0

Obtenez la même erreur, c'est pourquoi j'ai fait ce que j'ai fait ci-dessus. – torger

2

Il me semble que il est en cours d'exécution « xsel » qui imprime ses résultats sur stdout, puis en imprimant le code de retour (0) sur stdout. Vous n'obtenez pas les résultats du clip à partir de python.

Vous souhaitez probablement utiliser subprocess.popen et capturer stdout.

1

Si le zéro est toujours à la fin de la chaîne et que vous souhaitez simplement toujours supprimer le dernier caractère, faites st=st[:-1]. Ou, si vous n'êtes pas sûr qu'il y aura un zéro à la fin, vous pouvez le faire if st[-1]==0: st=st[:-1] ou ou if st[-1]==0: st=st[:-1].

4

Modifier: subprocess.call ne retourne pas une chaîne, mais un int - que 0 vous voyez (après la sortie réelle de xsel). Utilisez, à la place:

print subprocess.Popen('xsel', stdout=subprocess.PIPE).communicate()[0] 
+0

Perdu le demi-colon. – torger

+0

TypeError: l'objet 'int' est insubmersible - Je ne sais pas ce que je fais de mal - c'est peut-être la façon dont l'appel donne ses données. – torger

2

Le 0 et le nouveau saut de ligne à chaque ligne sont les seules choses imprimées par la commande d'impression python, où zéro est le code de retour du shell de subprocess.call. Le shell lui-même imprime d'abord le résultat à stdout, c'est pourquoi vous voyez le mot.

Editer: Voir les commentaires dans le post de S Mark pour l'épiphanie.

Questions connexes