Discussion:
[Python-de] os.startfile()
Matthias Huening
2004-08-10 15:06:55 UTC
Permalink
Hallo,

Kann es sein, dass os.startfile() nicht mit Unicode- bzw. UTF8-Filenamen
umgehen kann?

fragt: Matthias
Diez B. Roggisch
2004-08-10 17:55:17 UTC
Permalink
Post by Matthias Huening
Kann es sein, dass os.startfile() nicht mit Unicode- bzw. UTF8-Filenamen
umgehen kann?
Wie versuchst du das denn? Kannst du dir mit os.listdir() mal die Datei geben
und dann als argument fuer startfile nutzen? Laut doku unterstuetzt listdir
unicode, wenn das os es tut.

MfG Diez
Matthias Huening
2004-08-10 20:25:25 UTC
Permalink
Post by Diez B. Roggisch
Post by Matthias Huening
Kann es sein, dass os.startfile() nicht mit Unicode- bzw.
UTF8-Filenamen umgehen kann?
Wie versuchst du das denn? Kannst du dir mit os.listdir() mal die
Datei geben und dann als argument fuer startfile nutzen?
WinXP, Python 2.3.4
Über tkFileDialog einen Namen holen, der Zeichen enthält, die es in
Post by Diez B. Roggisch
Post by Matthias Huening
import tkFileDialog
import os
f = tkFileDialog.askopenfilename()
type(f)
<type 'unicode'>
Post by Diez B. Roggisch
Post by Matthias Huening
os.startfile(f)
Traceback (most recent call last):
File "<pyshell#10>", line 1, in -toplevel-
os.startfile(f)
UnicodeEncodeError: 'ascii' codec can't encode characters in position
14-16: ordinal not in range(128)
Schöne Grüße, Matthias
Diez B. Roggisch
2004-08-10 22:00:47 UTC
Permalink
Post by Matthias Huening
Post by Diez B. Roggisch
Post by Matthias Huening
Kann es sein, dass os.startfile() nicht mit Unicode- bzw.
UTF8-Filenamen umgehen kann?
Wie versuchst du das denn? Kannst du dir mit os.listdir() mal die
Datei geben und dann als argument fuer startfile nutzen?
WinXP, Python 2.3.4
Über tkFileDialog einen Namen holen, der Zeichen enthält, die es in
Post by Diez B. Roggisch
Post by Matthias Huening
import tkFileDialog
import os
f = tkFileDialog.askopenfilename()
type(f)
<type 'unicode'>
Post by Diez B. Roggisch
Post by Matthias Huening
os.startfile(f)
File "<pyshell#10>", line 1, in -toplevel-
os.startfile(f)
UnicodeEncodeError: 'ascii' codec can't encode characters in position
14-16: ordinal not in range(128)
Dann solltest du halt ein explizites

f2 = f.encode("utf8")
os.startfile(f2)

einbauen, in der Annahme das windows utf-8 namen kann.

MfG Diez
Matthias Huening
2004-08-11 01:57:52 UTC
Permalink
Post by Diez B. Roggisch
Dann solltest du halt ein explizites
f2 = f.encode("utf8")
os.startfile(f2)
einbauen, in der Annahme das windows utf-8 namen kann.
Tja, anscheinend falsche Annahme (leider):

"WindowsError: [Errno 2] Das System kann die angegebene Datei nicht
finden"

Hhmm.

Matthias
kgm
2004-08-10 23:50:45 UTC
Permalink
Hallo,
Post by Matthias Huening
Über tkFileDialog einen Namen holen, der Zeichen enthält, die es in
such mal in dieser List, das Thema Unicode (auch mit Tkinter), gab es hier
schon häufiger!
--
Freundliche Grüße
Klaus-G. Meyer
&quot;Martin v. Löwis&quot;
2004-08-11 13:06:18 UTC
Permalink
Post by Matthias Huening
Hallo,
Kann es sein, dass os.startfile() nicht mit Unicode- bzw. UTF8-Filenamen
umgehen kann?
Das kann sein. Mach mal einen Bugreport.

Der Tip mit dem expliziten .encode war schon gar nicht so schlecht.
Allerdings solltest Du als encoding sys.getfilesystemencoding()
angeben; unter Windows also "mbcs".

Ciao,
Martin
Matthias Huening
2004-08-11 13:55:25 UTC
Permalink
Post by &quot;Martin v. Löwis&quot;
Post by Matthias Huening
Kann es sein, dass os.startfile() nicht mit Unicode- bzw.
UTF8-Filenamen umgehen kann?
Das kann sein. Mach mal einen Bugreport.
Der Tip mit dem expliziten .encode war schon gar nicht so schlecht.
Allerdings solltest Du als encoding sys.getfilesystemencoding()
angeben; unter Windows also "mbcs".
Danke, Martin. So geht's.

Bugreport habe ich soeben gemacht [Request ID 1007046].

Schöne Grüße, Matthias
Matthias Huening
2004-08-11 14:32:47 UTC
Permalink
Matthias Huening <mhuening-
Post by Matthias Huening
Post by &quot;Martin v. Löwis&quot;
Der Tip mit dem expliziten .encode war schon gar nicht so schlecht.
Allerdings solltest Du als encoding sys.getfilesystemencoding()
angeben; unter Windows also "mbcs".
Danke, Martin. So geht's.
Da war ich etwas voreilig. Es funktioniert zwar mit Dateinamen, die
beispielsweise deutsche Umlaute enthalten, aber ein Dateiname mit
griechischen Zeichen macht leider immer noch Probleme...

Matthias
&quot;Martin v. Löwis&quot;
2004-08-12 11:59:51 UTC
Permalink
Post by Matthias Huening
Da war ich etwas voreilig. Es funktioniert zwar mit Dateinamen, die
beispielsweise deutsche Umlaute enthalten, aber ein Dateiname mit
griechischen Zeichen macht leider immer noch Probleme...
Natürlich - das kann nicht gehen, weil die in der lokalen codepage
(CP 1252) nicht unterstützt sind. Wenn Du unbedingt os.startfile
für eine solche Datei aufrufen musst, musst Du sie erst umbenennen
oder kopieren.

Alternativ könnte der Administrator die Systemcodepage auf Griechisch
setzen - dann kann man allerdings keine Dateien mit Umlauten mehr
verarbeiten.

Ciao,
Martin
Matthias Huening
2004-08-12 17:45:33 UTC
Permalink
Post by &quot;Martin v. Löwis&quot;
Post by Matthias Huening
Da war ich etwas voreilig. Es funktioniert zwar mit Dateinamen, die
beispielsweise deutsche Umlaute enthalten, aber ein Dateiname mit
griechischen Zeichen macht leider immer noch Probleme...
Natürlich - das kann nicht gehen, weil die in der lokalen codepage
(CP 1252) nicht unterstützt sind.
Heisst das, dass das in Griechenland wohl funktioniert, da dort auf den
meisten PCs die entsprechende Codepage eingestellt ist? (Das würde mein
Problem teilweise lösen: wer verwendet schon auf einem deutschen PC
griechische Filenamen...)
Noch (viel) besser wäre natürlich, wenn os.startfile() einfach Unicode
könnte.

Gibt's denn vielleicht eine Alternative, um Files mit dem passenden
Programm zu öffnen, ohne dass man weiss, um was für ein File es geht
und welche Software beim User installiert ist? Vielleicht sogar was
Platform-unabhängiges? (Denn os.startfile() ist ja wohl leider Windows-
only...)

Matthias
Diez B. Roggisch
2004-08-12 18:01:09 UTC
Permalink
Hallo,
Post by Matthias Huening
Heisst das, dass das in Griechenland wohl funktioniert, da dort auf den
meisten PCs die entsprechende Codepage eingestellt ist? (Das würde mein
Problem teilweise lösen: wer verwendet schon auf einem deutschen PC
griechische Filenamen...)
Noch (viel) besser wäre natürlich, wenn os.startfile() einfach Unicode
könnte.
os.startfile kann genau das, was das OS kann - wenn Windows kein utf8 bei
Dateinamen zulaesst bzw. nicht entsprechend konfiguriert ist, dann kann
python da nix dran drehen.... Angeblich benutzt ntfs utf8 - Martin kann da
bestimmt was zu sagen.
Post by Matthias Huening
Gibt's denn vielleicht eine Alternative, um Files mit dem passenden
Programm zu öffnen, ohne dass man weiss, um was für ein File es geht
und welche Software beim User installiert ist? Vielleicht sogar was
Platform-unabhängiges? (Denn os.startfile() ist ja wohl leider Windows-
only...)
Ne. Nur windows hat die komische Angewohnheit, nichtssagende 3 Buchstaben am
Ende einer Datei dazu heranzuziehen, den Typ der Datei zu bestimmen. Dafuer
hat es dann aber auch eine Datenbank (Registry) fuer die dafuer registrierten
Programme - und die nutzt os.startfile

Unter mac os gibts dafuer AFAIK meta-daten im resourcezweig - schonmal viel
besser. Wahrscheinlich gibts da auch eine entsprechende Datenbank.

Unter unix kannst du mit "file" den mimetype einer Datei ermitteln. Da stellt
sich dann aber das Problem der assoziation von Dateiname und Programm - kde
und gnome haben da was fuer, aber das ist dann eben auch proprietaer.

Diez
Peter Otten
2004-08-12 20:14:15 UTC
Permalink
Post by Diez B. Roggisch
Post by Matthias Huening
Noch (viel) besser wäre natürlich, wenn os.startfile() einfach Unicode
könnte.
os.startfile kann genau das, was das OS kann - wenn Windows kein utf8 bei
Dateinamen zulaesst bzw. nicht entsprechend konfiguriert ist, dann kann
python da nix dran drehen.... Angeblich benutzt ntfs utf8 - Martin kann da
bestimmt was zu sagen.
os.startfile() verwendet ShellExecute(), os.listdir() dagegen
FindFirstFileW() (siehe posixfile.c). Vielleicht lässt sich die Variante
ShellExecuteW(), falls es die gibt, irgendwie - don't ask me - von Hand
verwenden?

Peter
&quot;Martin v. Löwis&quot;
2004-08-13 13:37:38 UTC
Permalink
Post by Peter Otten
os.startfile() verwendet ShellExecute(), os.listdir() dagegen
FindFirstFileW() (siehe posixfile.c). Vielleicht lässt sich die Variante
ShellExecuteW(), falls es die gibt, irgendwie - don't ask me - von Hand
verwenden?
Nicht mit Board-Mitteln. Dazu braucht man calldll.

Alternativ könnte man unter Windows über os.spawn* das Programm start
benutzen. Leider kann spawn auch keine Unicode-Argumente...

Ciao,
Martin
&quot;Martin v. Löwis&quot;
2004-08-13 13:34:30 UTC
Permalink
Post by Diez B. Roggisch
os.startfile kann genau das, was das OS kann - wenn Windows kein utf8 bei
Dateinamen zulaesst bzw. nicht entsprechend konfiguriert ist, dann kann
python da nix dran drehen.... Angeblich benutzt ntfs utf8 - Martin kann da
bestimmt was zu sagen.
Windows (NT+) lässt durchaus beliebige Unicode-Dateinamen zu. Das ist
ja genau das Problem des OP: da ist eine Datei mit einem griechischen
Namen, aber os.startfile kann die nicht öffnen. Das liegt aber an
der Implementierung von os.startfile, die, wie Peter Otten beobachtet,
eigentlich ShellExecuteW aufrufen müsste.

Windows hat mit UTF-8 nicht so viel am Hut: Die Dateinamen werden
im NTFS in UTF-16LE gespeichert. Die API-Funktionen erwarten WCHAR
(zumindest die, die mit W enden).
Post by Diez B. Roggisch
Unter unix kannst du mit "file" den mimetype einer Datei ermitteln. Da stellt
sich dann aber das Problem der assoziation von Dateiname und Programm - kde
und gnome haben da was fuer, aber das ist dann eben auch proprietaer.
Man könnte natürlich trotzdem eine Bibliothek schreiben, die die
jeweiligen Mechanismen anspricht, und eine einheitliche Schnittstelle
dafür bietet.

Ciao,
Martin
&quot;Martin v. Löwis&quot;
2004-08-13 13:29:41 UTC
Permalink
Post by Matthias Huening
Heisst das, dass das in Griechenland wohl funktioniert, da dort auf den
meisten PCs die entsprechende Codepage eingestellt ist?
Korrekt.
Post by Matthias Huening
Noch (viel) besser wäre natürlich, wenn os.startfile() einfach Unicode
könnte.
Ja. Das wurde bei der PEP-277-Implementierung offenbar übersehen.
Post by Matthias Huening
Gibt's denn vielleicht eine Alternative, um Files mit dem passenden
Programm zu öffnen, ohne dass man weiss, um was für ein File es geht
und welche Software beim User installiert ist? Vielleicht sogar was
Platform-unabhängiges? (Denn os.startfile() ist ja wohl leider Windows-
only...)
Meines Wissens nicht. Du könntest versuchen, das File im Webbrowser
zu öffnen - und der kann in vielen Fällen die richtige Hilfsanwendung
starten. Dazu gibt es das Modul webbrowser.

Ciao,
Martin
Matthias Huening
2004-08-13 14:56:27 UTC
Permalink
Post by &quot;Martin v. Löwis&quot;
Meines Wissens nicht. Du könntest versuchen, das File im Webbrowser
zu öffnen - und der kann in vielen Fällen die richtige Hilfsanwendung
starten. Dazu gibt es das Modul webbrowser.
Hey - interessant. Ich wusste gar nicht, dass webbrowser versucht, die
jeweilige Anwendung zu starten. Scheint gut zu funktionieren.

AAaaaber - hier habe ich wieder dasselbe Problem wie bei os.startfile():
webbrowser.open() akzeptiert keine Unicode-Filenamen... Tja.

Schöne Grüße, Matthias
Matthias Huening
2004-08-13 15:02:06 UTC
Permalink
Matthias Huening <mhuening-
Post by Matthias Huening
AAaaaber - hier habe ich wieder dasselbe Problem wie bei
webbrowser.open() akzeptiert keine Unicode-Filenamen... Tja.
PS
... was auch kein Wunder ist, denn webbrowser verwendet unter Windows
os.startfile() ...

Schöne Grüße, Matthias
Alexander 'boesi' Bösecke
2004-08-13 18:07:27 UTC
Permalink
Hi
Post by Matthias Huening
... was auch kein Wunder ist, denn webbrowser verwendet unter Windows
os.startfile() ...
Das geht aber dummerweise in keinster Weise aus der Doku hervor. Die
kann man IMHO nur so interpretieren, dass die Datei in einem Browser
geoeffnet wird...

cu boesi
--
|¯|__ ___ ___ ____ _ .:·*ޝ #1671 : icq-intern
| Ž_ \ / _ \ / _ \ / __/ |_| |¯| #73628288 : icq-extern
| (_) )( (_) )( __/ \__ \ |¯| /¯¯¯¯\ boesi111 : aim
|____/__\___/__\___>_<___/_|_|________||¯| |__________i171 : reallife
Alexander 'boesi' Bösecke
2004-08-13 15:04:04 UTC
Permalink
Hi
Post by &quot;Martin v. Löwis&quot;
Meines Wissens nicht. Du könntest versuchen, das File im Webbrowser
zu öffnen - und der kann in vielen Fällen die richtige Hilfsanwendung
starten. Dazu gibt es das Modul webbrowser.
Hat das nen Grund warum bei mir mit diesem Modul die Datei nicht im
Browser sondern direkt in der Anwendung geoeffnet wird? Und das auch bei
Dateitypen, die der Browser selbst darstellen koennte, zb JPG.

,---------------------- [ Bsp-Code: ] ----------------------.
| import webbrowser, sys, os |
| |
| url = 'file://localhost/' + os.path.normpath(sys.argv[1]) |
| print url |
| webbrowser.open_new(url) |
`-----------------------------------------------------------Ž

Wenn ich die Ausgabe von print in die Addresszeile vom Browser paste,
reagiert der so, wie er soll, sprich fuer PDF wird das Acrobat-Plugin
gestartet usw.

Hintergrund meiner Versuche ist, das ich einen moeglichst portablen Weg
suche, eine Videodatei abzuspielen. Momentan hab ich das mit einem
rudimentaeren Player in pyGame realisiert, aber das ist nicht so recht
der Weisheit letzter Schuss.

cu boesi
--
baka baka #1671 : icq-intern
#73628288 : icq-extern
boesi111 : aim
i171 : reallife
Loading...