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.
Variablen in "subprocess.Popen" nutzen
"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.
-
- 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.
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.
Du versuchst ja auch noch immer die Zeichenkette "libreoffice" aufzurufen.
Lass dir doch mal ausgeben, was das eigentlich ist:
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.
Nicht ergänzen, sondern weglassen:
Code: Alles auswählen
subprocess.Popen([libreoffice, librefile])
-
- 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 !?
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 !?
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
-
- 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
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
@Horizonterweitungg: Jetzt musst du mir mal erklären, wie du in deinem vorletzen Post zu der folgenden Aussage kommst: und nun .
"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.
, wenn die Fehlermeldung in deinem ersten Post hießveraendert dies leider nichts am angezeigten Fehler
Code: Alles auswählen
FileNotFoundError: [WinError 2] Das System kann die angegebene Datei nicht finden"
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.
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:
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)
-
- 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.
Auch Dankeschoen an alle anderen die mir auf die Spruenge geholfen haben.