views:

188

answers:

6
#!/usr/bin/env python
import os, sys, subprocess, time
while True:    
    print subprocess.call("xsel", shell=True);
    time.sleep(1);

Takes an entry from the clipboard and prints it, every 1 second.

Result:

copied0
entry0
from0
clipboard0

I do not know why it returns the final 0, but it apparently stops me from using string strip (int has not strip), hence the 0 makes the string an integer?

How can one strip final 0 off the python string in the result above?

I'm a BASH scripter converting to python.

+2  A: 

"copied0".rstrip("0") should work

Actually, you better do like this, It wont show return code to the screen

import os, sys, subprocess, time
while True:    
    _ = subprocess.call("dir", shell=True);
    time.sleep(1);
S.Mark
I need to strip it iteratively as above. I've created this from your post: entry = subprocess.call("xsel", shell=True); print "entry".rstrip("0entry") - seems to work but isn't that elegant.
Nazarius Kappertaal
Tried that - AttributeError: 'int' object has no attribute 'rstrip' - the reason for the question.
Nazarius Kappertaal
Get the same error which is why I did what I did above.
Nazarius Kappertaal
No, the `0` IS from the python `print` command, it's the return code from subprocess.call ;-)
catchmeifyoutry
You're right! So just pass that variable to somewhere else. :-)
S.Mark
for future reference, added another answer to explain this
catchmeifyoutry
Thanks for reference, +1ed
S.Mark
No i mean i've added another answer, since all current answers talk about string manipulation. But of course you're free to update your answer too ;).
catchmeifyoutry
+2  A: 

It looks to me like it is running "xsel" which is printing its results to stdout, then printing the return code (0) to stdout. You are aren't getting the clip results from python.

You probably want subprocess.popen and to capture stdout.

Mark Peters
+1  A: 

If the zero is always at the end of the string, and so you simply always want the last character removed, just do st=st[:-1].

Or, if you are not sure that there will be a zero at the end, you can do if st[-1]==0: st=st[:-1].

Nikwin
+4  A: 

Edit: subprocess.call isn't returning a string, but an int -- that 0 you're seeing (after xsel's actual output). Use, instead:

print subprocess.Popen('xsel', stdout=subprocess.PIPE).communicate()[0]
Alex Martelli
Lost the semi;colon.
Nazarius Kappertaal
TypeError: 'int' object is unsubscriptable - I don't know what I'm doing wrong - perhaps its the way the call gives out its data.
Nazarius Kappertaal
+2  A: 

The 0 and new line feed at each line are the only things printed by the python print command, where zero is the shell return code from subprocess.call. The shell itself first prints it results first to stdout, which is why you see the word.

Edit: See the comments in S Mark's post for the epiphany.

catchmeifyoutry
+4  A: 

As Mark pointed out, subprocess.call() does not do what you want

Something like this should work

#!/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)
gnibbler
Thank you XD - so I have to use a different subprocess.
Nazarius Kappertaal
And we have success: print subprocess.Popen(["xsel"],stdout=subprocess.PIPE).stdout.read()
Nazarius Kappertaal
I am assuming that you did need to be able to catch the output of xsel, and not just print it to the terminal
gnibbler
Return from code from subprocess was the problem. 0 is successful.
Nazarius Kappertaal
If you want to check the return code it is saved in `p.returncode`
gnibbler