Variablen in "subprocess.Popen" nutzen

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
Horizonterweiterung
User
Beiträge: 5
Registriert: Montag 9. Mai 2022, 08:25

Hallo Zusammen,

ich bin hier neu und habe beim Versuch etwas in PHYTON zu programmieren groessere Schwierigkeiten.
Ich moechte eigentlich etwas sehr simples tun:
Mein Ziel ist es eine Datei mit LibreOffice calc zu oeffnen.
Damit dies immer funktioniert habe ich die Pfade von LibreOffice scalc.exe und der zu bearbeitenden Datei in ein Textfile geschrieben.
Dieses Textfile lese ich mit der Funbktion readlines() aus und schreibe die beiden Pfade in jeweils eine Variable.

libreoffice
librefile

Print (libreoffice)
C:\Program Files\LibreOffice\program\scalc.exe

Print (librefile)
C:\Users\Username\Desktop\Tests\Kalender.ods

Mit diesen beiden Variablen wollte ich nun die Funktion "subprocess.Popen" zum Start von "Scalc.exe" und "Kalender.ods" beaufschlagen.
Das Ergebnis ist leider sehr ernuechternd. Egal was ich auch versuche, ich bekomme immer die gleiche Fehlermeldung:

subprocess.Popen(["libreoffice", "librefile"])

liefert

FileNotFoundError: [WinError 2] Das System kann die angegebene Datei nicht finden

Wenn ich meine Variablen ueber die Funktion "Print()" anzeige sind diese absolut korrekt. Ebenso funktioniert ein Start ueber die Windows-Eingabeaufforderung (cmd) unter Verwendung der mit der Print-Funktion angezeigten Pfade problemlos.
Wenn ich die "subprocess.Popen-Funktion" mit dem Pfad fuettere funktioniert es ebenfalls problemlos.

subprocess.Popen([r"C:\Program Files\LibreOffice\program\scalc.exe", r"C:\Users\Username\Desktop\Tests\Kalender.ods"])

Dieser Aufruf funktioniert, ist allerdings nicht das was ich programmieren moechte, da die Pfade ja je nach Installation sehr stark variieren koennen.

Was mache ich falsch ?

Mein System: PHYTHON 3.10 auf Windows 10, 64bit

Ich bin fuer jede Hile sehr dankbar.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

"libreoffice" ist ein literaler String und kein Variablenname. Bei print hast Du ja auch keine Anführungszeichen. Aus Deiner Beschreibung wird aber auch nicht klar, ob Du die Datei korrekt liest oder ob in den Zeilen noch das Zeileendezeichen enthalten ist.
Horizonterweiterung
User
Beiträge: 5
Registriert: Montag 9. Mai 2022, 08:25

Hallo Sirius3,

vielen Dank fuer Deinen Hinweis.
Das Zeilenendezeichen ist definitiv nicht enthalten, weil ich die Variablen mit der "strip()"-Funbktion bereinigt habe.
Ich habe die Variablen mit den Anfuehrungszeichen ergaenzt, ebenso habe ich ein Leerzeichen hinter der variable "libreoffice" hinzugefuegt.

Neuer Wert der Variable "libreoffice"
"C:\Program Files\LibreOffice\program\scalc.exe"
Neuer Wert der Variable "librefile"
"C:\Users\HStad\Desktop\Tests\Kalender.ods"

Ergebnis:
Ob ich den Aufruf so
subprocess.Popen(["libreoffice", "librefile"])
oder so mache
subprocess.Popen([r"libreoffice", r"librefile"])
aendert leider ueberhaupt nichts am Ergebnis.
Der Fehler und die Fehlermeldung bleiben die gleiche.
Benutzeravatar
sparrow
User
Beiträge: 4184
Registriert: Freitag 17. April 2009, 10:28

Du versuchst ja auch noch immer die Zeichenkette "libreoffice" aufzurufen.
Lass dir doch mal ausgeben, was das eigentlich ist:

Code: Alles auswählen

print("libreoffice")
print(libreoffice)
Zuletzt geändert von sparrow am Donnerstag 19. Mai 2022, 09:03, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Nicht ergänzen, sondern weglassen:

Code: Alles auswählen

subprocess.Popen([libreoffice, librefile])
Horizonterweiterung
User
Beiträge: 5
Registriert: Montag 9. Mai 2022, 08:25

Hallo sparrow und sirius3,

bei der print()-Funktion bekomme ich folgende Ausgabe:
print (libreoffice)
"C:\Program Files\LibreOffice\program\scalc.exe"
print (librefile)
"C:\Users\HStad\Desktop\Tests\Kalender.ods"
print("libreoffice")
libreoffice
print("librefile")
librefile

OK, sparrow und sirius3, ich habe den Hinweis mit den Anfuehrungszeichen verstanden.

Wenn ich die Anfuehrungszeichen wieder wegmache und den Befehlsaufruf verwende wie sirius3 es geschrieben hat, veraendert dies leider nichts am angezeigten Fehler !?
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte den vollständigen Code und die vollständige Fehlermeldung posten. Aussagen, das man alles richtig gemacht hat, aber es trotzdem nicht geht, kann man nicht beurteilen. Außer das es offensichtlich nicht stimmt 🤷‍♂️
Horizonterweiterung
User
Beiträge: 5
Registriert: Montag 9. Mai 2022, 08:25

Hallo __deets__,

na dann hoffe ich das Du den Fehler findest.

Meine Code:
import os, subprocess, time
with open(r'C:\Users\HStad\Desktop\Buisiness\Variantenerzeuger\Tests\Config\Config.txt','r') as f:
libreoffice = f.readlines()[1]
libreoffice = libreoffice[22:] #Program path for LibreOffice
libreoffice = '"'+libreoffice.strip()+'" '
print (libreoffice)
with open(r'C:\Users\HStad\Desktop\Buisiness\Variantenerzeuger\Tests\Config\Config.txt','r') as f:
librefile = f.readlines()[8]
librefile = '"'+librefile.strip()+'"'
print (librefile)
#librestart = (libreoffice.strip())+" "+(librefile.strip())
print ("libreoffice")
print ("librefile")
#print (librestart)
#LibreOffice Start
subprocess.Popen([libreoffice, librefile])
#subprocess.Popen([r"C:\Program Files\LibreOffice\program\scalc.exe", r"C:\Users\HStad\Desktop\Tests\Kalender.ods"])

Fehlermeldung:
Python 3.10.4 (tags/v3.10.4:9d38120, Mar 23 2022, 23:13:41) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more information.

= RESTART: C:\Users\HStad\Desktop\Buisiness\Variantenerzeuger\Tests\Datei auslesen2.py
"C:\Program Files\LibreOffice\program\scalc.exe"
"C:\Users\HStad\Desktop\Tests\Kalender.ods"
libreoffice
librefile
Traceback (most recent call last):
File "C:\Users\HStad\Desktop\Buisiness\Variantenerzeuger\Tests\Datei auslesen2.py", line 16, in <module>
subprocess.Popen([libreoffice, librefile])
File "C:\Users\HStad\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 966, in __init__
self._execute_child(args, executable, preexec_fn, close_fds,
File "C:\Users\HStad\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1435, in _execute_child
hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
PermissionError: [WinError 5] Zugriff verweigert
Benutzeravatar
sparrow
User
Beiträge: 4184
Registriert: Freitag 17. April 2009, 10:28

@Horizonterweitungg: Jetzt musst du mir mal erklären, wie du in deinem vorletzen Post zu der folgenden Aussage kommst:
veraendert dies leider nichts am angezeigten Fehler
, wenn die Fehlermeldung in deinem ersten Post hieß

Code: Alles auswählen

FileNotFoundError: [WinError 2] Das System kann die angegebene Datei nicht finden"
und nun

Code: Alles auswählen

PermissionError: [WinError 5] Zugriff verweigert
.

"Zugriff verweigert" bedeutet, dass dir entweder die Rechte fehlen, zu tun, was du möchtest, oder die Datei bereits geöffnet ist.
Mach also mal Calc zu und probier es dann nochmal.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Macht es Sinn, eine Datei komplett zweimal zu lesen, nur um jeweils eine Zeile rauszupicken?
Warum ist der office-Pfad in der zweiten Zeile erst ab Zeichen 22? Magische Indexwerte sollte man nicht benutzen, weil die sehr schnell nicht mehr stimmen könnten.
Du hast zwar geschrieben, dass Du das Zeile-Endezeichen wegstrippst, aber dann fügst Du noch Anführungszeichen und Leerzeichen hinzu. Klar, dass Windows keine Lust hat, auf solch einen Pfad zuzugreifen.

Und wenn es Dir wirklich nur darum geht, eine Office-Datei zu öffnen, dann kannst Du Dir das alles sparen und `start` benutzen:

Code: Alles auswählen

import os

with open(r'C:\Users\HStad\Desktop\Buisiness\Variantenerzeuger\Tests\Config\Config.txt','r') as f:
    librefile = f.readlines()[8].strip()
os.startfile(librefile)
Horizonterweiterung
User
Beiträge: 5
Registriert: Montag 9. Mai 2022, 08:25

Super, Dankeschoen Sirius3. Funktioniert bestens !

Auch Dankeschoen an alle anderen die mir auf die Spruenge geholfen haben.
Antworten