subprocess und PermissionError: [WinError 5] Zugriff verweigert

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
tibiTheRedPanda
User
Beiträge: 4
Registriert: Dienstag 10. September 2019, 13:42

Guten Tag,

ich habe ein Problem, an dem ich jetzt schon lange hänge und leider bisher auch keine Foreneinträge finden konnte, die mir helfen. Ich habe ein Skript geschrieben, dass Wordconv.exe aufrufen soll. Wenn ich das manuell ohne Python mache sieht das so aus und funktioniert ohne Probleme:

"C:\Program Files (x86)\Microsoft Office\Office16\Wordconv.exe" -oice -nme "C:\doc2docx\doc\Beispiel.doc" "C:\doc2docx\docx\Beispiel.docx"

Die .exe wandelt eine .doc-Datei in eine .docx-Datei um.

In meinem .py-Skript steht:

Code: Alles auswählen

subprocess.call([Wordconv_path, "-oice", "-nme", src_path, dst_path])
Wordconv_path, src_path und dst_path sind natürlich jeweils die Pfade zu den Dateien.

Wenn ich das Skript ausführe taucht dann ein Fehler auf:
PermissionError: [WinError 5] Zugriff verweigert
Ich habe bereits versucht das Skript als Administrator auszuführen - leider mit dem selben Ergebnis.
Ich bedanke mich schon mal an alle, die sich die Mühe machen und über mein Problem grübeln oder einen Lösungsvorschlag anbieten.

Falls Ihr noch weitere Informationen benötigt, sagt mir bitte Bescheid.

Gruß Stefan






ps. die gesamte Meldung:
Traceback (most recent call last):

File "<ipython-input-3-f49469283129>", line 1, in <module>
runfile('C:/Christian doc2docx/doc2docx/doc2docx.py', wdir='C:/Christian doc2docx/doc2docx')

File "C:\Users\sschoenhaerl\AppData\Roaming\Python\Python37\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
execfile(filename, namespace)

File "C:\Users\sschoenhaerl\AppData\Roaming\Python\Python37\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)

File "C:/Christian doc2docx/doc2docx/doc2docx.py", line 20, in <module>
call_Wordconv(paths[0], paths[1], paths[2])

File "C:/Christian doc2docx/doc2docx/doc2docx.py", line 14, in call_Wordconv
subprocess.call([Wordconv_path, "-oice", "-nme", src_path, dst_path])

File "c:\users\sschoenhaerl\appdata\local\programs\python\python37-32\lib\subprocess.py", line 323, in call
with Popen(*popenargs, **kwargs) as p:

File "C:\Users\sschoenhaerl\AppData\Roaming\Python\Python37\site-packages\spyder_kernels\customize\spydercustomize.py", line 143, in __init__
super(SubprocessPopen, self).__init__(*args, **kwargs)

File "c:\users\sschoenhaerl\appdata\local\programs\python\python37-32\lib\subprocess.py", line 775, in __init__
restore_signals, start_new_session)

File "c:\users\sschoenhaerl\appdata\local\programs\python\python37-32\lib\subprocess.py", line 1178, in _execute_child
startupinfo)

PermissionError: [WinError 5] Zugriff verweigert
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Wordconv_path sollte wordconv_path heißen.

Unabhängig davon: ob das "natürlich" die Pfade sind, ist gar nicht so natürlich. Was gibt denn folgendes direkt vor der subprocess-Zeile aus?

Code: Alles auswählen

print(Wordconv_path, src_path, dst_path)
Meistens ist es übrigens ein Zugriffsproblem auf eine der Dateien. Sie könnte zum Beiispiel bereits geöffnet sein.
Zuletzt geändert von sparrow am Dienstag 10. September 2019, 14:26, insgesamt 1-mal geändert.
tibiTheRedPanda
User
Beiträge: 4
Registriert: Dienstag 10. September 2019, 13:42

sparrow hat geschrieben: Dienstag 10. September 2019, 14:18 Wordconv_path sollte wordconv_path heißen.

Unabhängig davon: ob das "natürlich" die Pfade sind, ist gar nicht so natürlich. Was gibt denn folgendes direkt vor der subprocess-Zeile aus?

Code: Alles auswählen

print(Wordconv_path, src_path, dst_path)
Danke für die schnelle Antwort:
Das habe ich bereits geprüft. Ich habe

Code: Alles auswählen

print(Wordconv_path, "-oice", "-nme", src_path, dst_path)
ausgeführt und die Ausgabe direkt in die Konsole kopiert. Das klappt dann und führt zum gewünschten Ergebnis.

Die Funktion in der das Problem auftritt sieht so aus:

Code: Alles auswählen

def call_Wordconv(Wordconv_path, src_path, dst_path):
    print(Wordconv_path, "-oice", "-nme", src_path, dst_path)
    subprocess.call([Wordconv_path, "-oice", "-nme", src_path, dst_path])
#    subprocess.call([Wordconv_path, "-oice", "-nme", src_path, dst_path], shell = True)
Wenn ich die letzte Zeile statt der vorletzten ausführe tritt der Fehler nicht auf, funktionieren tut's aber leider trotzdem nicht.
Zuletzt geändert von tibiTheRedPanda am Dienstag 10. September 2019, 14:28, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Kannst du dir von Python per zB os Modul oder per pathlib-Modul die Inhalte der gewuenschten Ordner (sowohl fuer die EXE als auch src/dst) anzeigen lassen?
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Wenn ich Pfade mit escaped Backslashes einfach in die Konsole kopiere, kann ich die nicht einfach ausführen...
Zeig doch mal die vorgeschlagene print-Ausgabe, damit wir das ausschließen können.
tibiTheRedPanda
User
Beiträge: 4
Registriert: Dienstag 10. September 2019, 13:42

Die print-Ausgabe liefert:
"C:\Program Files (x86)\Microsoft Office\Office16\Wordconv.exe" -oice -nme "C:\Christian doc2docx\doc\QM-PB 4.2.3-1 Lenkung von Dokumenten und Technischen Unterlagen_Rev15.doc" "C:\Christian doc2docx\docx\QM-PB 4.2.3-1 Lenkung von Dokumenten und Technischen Unterlagen_Rev15.docx"
Ich weiß nicht wieso, aber ich habe das mit den escaped Backslashes total vergessen. Tut mir leid für diesen dummen Fehler. Ich habe die Pfade aus einer externen Textdatei entnommen wo sie nicht escaped sind.
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Funktioniert es denn, wenn die Bachslashes escaped sind?
Also konkret:

Code: Alles auswählen

wordconv_path = r"C:\Program Files (x86)\Microsoft Office\Office16\Wordconv.exe"
src_path = r"C:\Christian doc2docx\doc\QM-PB 4.2.3-1 Lenkung von Dokumenten und Technischen Unterlagen_Rev15.doc"
dst_patH = r"C:\Christian doc2docx\docx\QM-PB 4.2.3-1 Lenkung von Dokumenten und Technischen Unterlagen_Rev15.docx"
subprocess.call([wordconv_path, "-oice", "-nme", src_path, dst_path])
Und in deinem Beispiel hieß das Verzeichnis "doc2docx" nicht "Christian doc2docx"
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@tibiTheRedPanda: Da sind ein Haufen Anführungszeichen (") zuviel wenn das tatsächlich die `print()`-Ausgabe war, denn die gehören ja gar nicht zum Dateinamen. Die musst Du in der *Shell* eingeben um die Leerzeichen vor der Shell zu schützen, aber natürlich *nicht* wenn Du nur den Namen angeben musst.

Ist die Frage wo die her kommen. Sind die schon in der Datei? Falls ja, warum?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
tibiTheRedPanda
User
Beiträge: 4
Registriert: Dienstag 10. September 2019, 13:42

Guten Morgen. Ich hab es jetzt heute zum laufen gebracht, hatte gestern nicht mehr den Kopf dafür.

Ja, das was ich als print-Ausgabe gepostet habe, war wirklich die Ausgabe. Da wurde der Fehler auch direkt erkannt, VIELEN DANK dafür: Da gab es zu viele Anführungszeichen "". Als ich heute diese Anführungszeichen mit

Code: Alles auswählen

.replace('"','')
entfernt habe hat es endlich geklappt. Die kommen schon aus der Datei aus der ich die Dateipfade entnehme. Die sind da, weil wenn man unter Windows "Als Pfad kopieren" klickt, eben diese dabei sind. Damit soll es leichter von Hand wartbar sein.
Das mit den Backslashes hatte schon so gestimmt wie ursprünglich gemacht, klappt zumindest. Aber trotzdem vielen Dank auch für die Antworten. Ich war mir da wirklich unsicher wie das so ist

Randnotiz:
Und in deinem Beispiel hieß das Verzeichnis "doc2docx" nicht "Christian doc2docx"
Ja das stimmt, aber das Skript soll eben auch für eine Vielzahl an Ordnern laufen und ich hab beim testen eben mal den einen und dann den anderen Ordner verwendet. Sorry für die Verwirrung.

Wünsch noch nen schönen Tag, Ciao
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@tibiTheRedPanda: statt irgendwie `replace` aufzurufen, solltest Du bereits beim Lesen der Datei die Anführungszeichen richtig verarbeiten. Da Du den Code nicht gezeigt hast, kann ich dazu nichts sagen, aber nützliche wäre z.B. shlex.split.
Antworten