Seite 1 von 1
Pexpect -> Exception exceptions.OSError
Verfasst: Samstag 19. Mai 2007, 22:03
von think
Ich versuche mich gerade ein erstes mal mit Pexpect und habe nun folgendes Problem. Ich mache einen ganz normalen pexpect.spawn aufruf und will dann darauf reagieren. Das sieht folgendermassen aus:
Code: Alles auswählen
def x(self, event):
child = pexpect.spawn('sudo touch /home/x/test.txt')
child.expect('Password:')
child.sendline(x)
Daraufhin kriege ich dann folgende Fehlermeldung:
Code: Alles auswählen
Exception exceptions.OSError: (1, 'Operation not permitted') in <bound method spawn.__del__ of <pexpect.spawn object at 0x8618dac>> ignored
System ist Kubuntu 7.04. Python 2.5
Nun weiss ich nicht wo das Problem liegen könnte. Leider hat mir weder Google noch die Doku weitergeholfen. Wäre toll wenn jemand helfen könnte.
Verfasst: Sonntag 20. Mai 2007, 12:25
von thelittlebug
Ich hab das jetzt auh mal ausprobiert. Ich bekomme keine Fehlermeldung aber es passiert auch einfach nichts. Angeblich gibt es aber mehrere Expect Pakete für Python. Vielleicht sollte man da ein anderes probieren?
lgherby
Verfasst: Sonntag 20. Mai 2007, 12:38
von think
Was gibt es denn noch für Alternativen? Ich habe nur Pexpect gefunden, dass genau diese Anforderungen erfüllt.
Verfasst: Sonntag 20. Mai 2007, 12:58
von thelittlebug
Also die FAQ auf der offiziellen Seite behauptet:
Q: Isn't there already a Python Expect?
A: Yes, there are several of them. They usually require you to compile C. I wanted something that was pure Python and preferably a single module that was simple to install. I also wanted something that was easy to use. This pure Python expect only recently became possible with the introduction of the pty module in the standard Python library. Previously C extensions were required.
Gefunden habe ich aber keine Alternative, die sind warscheinlich gut versteckt. Ich probiers aber noch ein paar Minuten.
lgherby
Verfasst: Sonntag 20. Mai 2007, 13:06
von think
Dank dir schonmal. Habe noch folgendes gefunden:
http://expect.nist.gov/
http://www.lysator.liu.se/~ceder/pcl-expect/
Allerdings hätte ich es doch am liebsten mit Pexpect gelöst. Hört sich am besten an.
Verfasst: Sonntag 20. Mai 2007, 13:11
von thelittlebug
Vergiss das mit den Alternativen doch. pexpect geht nämlich im interaktivem Modus von Python nicht. Ich habe das Programm jetzt noch wirklich in eine Datei geschrieben und es läuft.
Code: Alles auswählen
import pexpect
child = pexpect.spawn('sudo touch /home/thelittlebug/Desktop/pexpect.txt')
child.expect('Password:')
child.sendline('meinpw')
Als Ausgabe bekomme ich dieses
Code: Alles auswählen
thelittlebug@ubuntu:~/Desktop$ python test.py
Traceback (most recent call last):
File "test.py", line 4, in <module>
child.expect('Password:')
File "/usr/lib/python2.5/site-packages/pexpect.py", line 1064, in expect
return self.expect_list(compiled_pattern_list, timeout, searchwindowsize)
File "/usr/lib/python2.5/site-packages/pexpect.py", line 1132, in expect_list
raise EOF (str(e) + '\n' + str(self))
pexpect.EOF: End Of File (EOF) in read_nonblocking(). Exception style platform.
<pexpect.spawn object at 0xb7df1d8c>
version: 2.1 ($Revision: 395 $)
command: /usr/bin/sudo
args: ['/usr/bin/sudo', 'touch', '/home/thelittlebug/Desktop/pexpect.txt']
patterns:
Password:
buffer (last 100 chars):
before (last 100 chars):
after: <class 'pexpect.EOF'>
match: None
match_index: None
exitstatus: 0
flag_eof: True
pid: 5924
child_fd: 3
closed: False
timeout: 30
delimiter: <class 'pexpect.EOF'>
logfile: None
maxread: 2000
ignorecase: False
searchwindowsize: None
delaybeforesend: 0.1
delayafterclose: 0.1
delayafterterminate: 0.1
Ich hab echt keine Ahnung ob mir das Sorgen machen muss oder nicht.

Geht bei dir meine Version des Codes auch?
lgherby
Verfasst: Sonntag 20. Mai 2007, 13:16
von think
Krieg immer die gleiche Fehlermeldung:
Code: Alles auswählen
Exception exceptions.OSError: (1, 'Operation not permitted') in <bound method spawn.__del__ of <pexpect.spawn object at 0xb7d9aacc>> ignored
Verfasst: Sonntag 20. Mai 2007, 13:30
von thelittlebug
Und wenn du mal sudo weglässt und irgend einen anderen Befehl probierst. Ich schieb die Schuld einfach mal darauf.
probier mal ftp fernzusteuern.
hier ein ftplog zum testen
Code: Alles auswählen
thelittlebug@ubuntu:~/Desktop$ ftp
ftp> open ftp.inode.at
Connected to members.inode.at.
220-
220-
220------------------------------------------------
220-
220- WILLKOMMEN AM FTP-SERVER VON INODE
220-
220-E-Mail: support@inode.at - Tel.: +43 59 999
220-
220------------------------------------------------
220-
220-
220 Inode.Internet FTP service
Name (ftp.inode.at:thelittlebug): guest
331 Anonymous login ok, send your complete email address as your password.
Password:
230 Zugangsberechtigung f�r User <guest> erfolgreich!
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
lgherby
Verfasst: Sonntag 20. Mai 2007, 13:37
von think
Wenn ich Sudo weglasse, brauche ich Pexpect gar nicht mehr.
Mein einziges Ziel ist genau das Beispiel im ersten Post. Brauche weder Rückgabewerte noch sonstiges.
Verfasst: Sonntag 20. Mai 2007, 13:44
von schlangenbeschwörer
Du könntest aber mal was anderes ausprobieren um den Fehler zu lokalisieren und dann vlt. auch besser beheben zu können

Verfasst: Sonntag 20. Mai 2007, 13:51
von think
Hab schon sämtiche Sample-Scripte durchgearbeitet. Immer die gleiche Fehlermeldung.

Verfasst: Sonntag 20. Mai 2007, 13:55
von thelittlebug
Was ich damit feststellen wollte: Vielleicht ist ja was an deinem System verstellt und die Schuld gar nicht bei pexpect zu suchen.
Sonst könnte ich das hier anbieten das sollte dann auch ohne pexpect gehen
Code: Alles auswählen
echo meinpassword | sudo -S touch /home/thelittlebug/Desktop/sudotest.txt
Gibt zwar auch nen Fehler auf der Shell wenn sudo das password schon kennt, läuft aber trotzdem durch.
lgherby
Verfasst: Montag 21. Mai 2007, 07:59
von think
Werde das bei Zeit probieren. Sitze hier allerdings gerade mal ne Woche in nem Netzwerkkurs fest. Danke dir schonmal. Werde mich hier wieder melden.