sicher herausfinden, ob unter Windows

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
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Mittwoch 6. September 2006, 18:49

Hallo,

die Frage mag dumm für regelmäßige Windows-Nutzer sein, aber ich habe schlicht keine Ahnung ...
Ich möchte gerne in einer Applikation reagieren, wenn sie unter Windows läuft, was hoffentlich bald der Fall ist. Es soll hierbei gleichgültig sein, welche Version von Windows.
Wird solch eine Abfrage alle Versionen des OS abdecken oder ist diese Form nicht sonderlich clever und ihr wißt etwas besseres:

Code: Alles auswählen

if 'WIN' in sys.platform.upper():
(womöglich kann ich auch 'win' schreiben und auf das upper() verzichten, oder ist der String nicht unbedingt immer klein geschrieben?)

Gruß,
Christian
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 6. September 2006, 20:12

CM hat geschrieben:Es soll hierbei gleichgültig sein, welche Version von Windows.
Hallo Christian!

Mit ``if sys.platform == "win32":`` deckst du derzeit alles von Window 98 bis Windows Server 2003 ab. Wie das mit den 64BIT-Systemen läuft, kann ich nicht herausfinden, aber ein Win98 habe ich soeben zum Testen im VMware laufen lassen.

Es gibt da aber auch noch eine andere Methode:

Code: Alles auswählen

>>> import sys
>>> try:
...     sys.winver
...     print "du hast Windows"
... except:
...     print "du hast kein Windows"
... 
'2.4'
du hast Windows
>>> 
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Donnerstag 7. September 2006, 00:03

Hi :)

Weiß zwar nicht obs weiterhilft aber ich probiere es mal.

Wenn es dir Speziell darum geht die Windowsversion rauszukriegen (Also Z.B. win98, XP, ect), dann kann die Methode getwindowsversion() weiterhelfen.

Die Methode liefert ein Tumple zurück mit folgenden Format: (major, minor, build, platform, text). platform ist ein wert vom Typ Int.
0 = win32s,
1 = Windows 9x/ME,
2 = Windows NT/2000/XP

Lieder gibt es hier auch keinen wert für Windows XP64 oder Windows Vista (was ja aber noch nicht draußen ist). Zumindest kann man damit aber eingrenzen um welches Betreibsystem es sich tatsächlich handelt von Microsoft bzw. vom Type 98 oder vom Type NT.

Hier mal ein Beispiel:
INPUT:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys

win_platform = sys.getwindowsversion()

if   win_platform[3] == 1:
     print "Sie haben Windows 9x oder Windows ME als Betriebsystem."
elif win_platform[3] == 2:
     print "Sie haben Windows NT/2000/XP als Betriebsystem."

Was die Integerwerte von major, minor, build (Build des OS?) angeben weiß ich leider nicht. Konnte dazu auch keine Infos in der pydoc finden.

Wenn die Windowsplattform egal ist, dann ist die Methode von gerold in jeden fall zu bevorzugen! Wenn du aber speziellere Sachen machen willst die z.B. Win98 nicht unterstützt (extern Code (Z.B. in C/C++ als PI für Python) der auf bestimmte Funktionen der API zurückgreift), dann ist die Methode mit getwindowsversion() die richtige.

lg
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 7. September 2006, 07:08

Man kann ein wenig in PyPy rumschnüffeln... Könnte man zwar auch in der C Variante von CPython's sys, aber C ist ja doof...

Also mit google konnte ich was ausmachen:
http://www.google.de/search?hl=de&as_qd ... uche&meta=

Treffer:
http://codespeak.net/svn/pypy/dist/lib- ... latform.py

Ein paar Codefetzen:

Code: Alles auswählen

supported_platforms=('win32','win16','dos','os2')
Da wird wohl versucht mit der Konnamdozeile die Version raus zu bekommen, das aber anscheinend nur im Notfall:

Code: Alles auswählen

for cmd in ('ver','command /c ver','cmd /c ver'):
Ansonsten wird wohl direkt in def win32_ver() die win32api genommen:

Code: Alles auswählen

def win32_ver(release='',version='',csd='',ptype=''):

    """ Get additional version information from the Windows Registry
        and return a tuple (version,csd,ptype) referring to version
        number, CSD level and OS type (multi/single
        processor).

        As a hint: ptype returns 'Uniprocessor Free' on single
        processor NT machines and 'Multiprocessor Free' on multi
        processor machines. The 'Free' refers to the OS version being
        free of debugging code. It could also state 'Checked' which
        means the OS version uses debugging code, i.e. code that
        checks arguments, ranges, etc. (Thomas Heller).

        Note: this function only works if Mark Hammond's win32
        package is installed and obviously only runs on Win32
        compatible platforms.

    """
    # XXX Is there any way to find out the processor type on WinXX ?
    # XXX Is win32 available on Windows CE ?
    #
    # Adapted from code posted by Karl Putland to comp.lang.python.
    #
    # The mappings between reg. values and release names can be found
    # here: http://msdn.microsoft.com/library/en-us/sysinfo/base/osversioninfo_str.asp

    # Import the needed APIs
    try:
        import win32api
    except ImportError:
        return release,version,csd,ptype
    from win32api import RegQueryValueEx,RegOpenKeyEx,RegCloseKey,GetVersionEx
    from win32con import HKEY_LOCAL_MACHINE,VER_PLATFORM_WIN32_NT,\
                         VER_PLATFORM_WIN32_WINDOWS

    # Find out the registry key and some general version infos
    maj,min,buildno,plat,csd = GetVersionEx()
    version = '%i.%i.%i' % (maj,min,buildno & 0xFFFF)
    if csd[:13] == 'Service Pack ':
        csd = 'SP' + csd[13:]
    if plat == VER_PLATFORM_WIN32_WINDOWS:
        regkey = 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion'
        # Try to guess the release name
        if maj == 4:
            if min == 0:
                release = '95'
            elif min == 10:
                release = '98'
            elif min == 90:
                release = 'Me'
            else:
                release = 'postMe'
        elif maj == 5:
            release = '2000'
    elif plat == VER_PLATFORM_WIN32_NT:
        regkey = 'SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion'
        if maj <= 4:
            release = 'NT'
        elif maj == 5:
            if min == 0:
                release = '2000'
            elif min == 1:
                release = 'XP'
            elif min == 2:
                release = '2003Server'
            else:
                release = 'post2003'
    else:
        if not release:
            # E.g. Win3.1 with win32s
            release = '%i.%i' % (maj,min)
        return release,version,csd,ptype

    # Open the registry key
    try:
        keyCurVer = RegOpenKeyEx(HKEY_LOCAL_MACHINE,regkey)
        # Get a value to make sure the key exists...
        RegQueryValueEx(keyCurVer,'SystemRoot')
    except:
        return release,version,csd,ptype

    # Parse values
    #subversion = _win32_getvalue(keyCurVer,
    #                            'SubVersionNumber',
    #                            ('',1))[0]
    #if subversion:
    #   release = release + subversion # 95a, 95b, etc.
    build = _win32_getvalue(keyCurVer,
                            'CurrentBuildNumber',
                            ('',1))[0]
    ptype = _win32_getvalue(keyCurVer,
                           'CurrentType',
                           (ptype,1))[0]

    # Normalize version
    version = _norm_version(version,build)

    # Close key
    RegCloseKey(keyCurVer)
    return release,version,csd,ptype
Also gibt es irgendwie noch das "post2003"...

Ich seh gerade, das bei CPython es auch ein platform.py gibt:

http://svn.python.org/view/python/trunk ... iew=markup

Ist wohl das selbe wie von pypy...


.oO(Konnte ich jetzt überhaupt weiterhelfen... :)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Donnerstag 7. September 2006, 08:26

Hallo,

vielen Dank für eure Antworten. Sie stellen teilweise einen ziemlichen Overkill für meine Frage dar ;-). Mir geht es wirklich nur um die Frage unter Windows oder nicht? Grund: Meine Applikation bietet ein Interface für eine Uralt-Fortransoftware an, die mit an Sicherheit grenzender Wahrscheinlichkeit niemals nicht auf einem Windowssystem installiert sein wird. In dem Fall kann der Nutzer zwar mit dem Interface spielen (warum auch nicht), darf aber keinerlei Funktionalität erwarten. Tja, das will ich ihr / ihm auch mitteilen (und das ist auch wichtig, denn die Windows-Version meines Programms ist bloß für Studenten gedacht, die gerade erst ins Fach einsteigen).

Dennoch, ich denke der Fall ist nun klar. Vielen Dank.

Gruß,
Christian
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Donnerstag 7. September 2006, 08:51

Hi!

Ich bin mal so unverschämt und werde OT:

Christian, wie verbindest du Fortran mit Python? Nutzt du f2py, oder generierst du mit Python Inputfiles die das Fortran Programm einliest? Oder ganz anders? Oder gar nicht? :)

Gruß, mawe
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Donnerstag 7. September 2006, 09:36

Hi mawe,

nein, ich kann zwar inzwischen etwas mehr Fortran, aber "richtig" programmieren tue ich damit nicht. (Im Zweifel weiche ich eher auf C als auf Fortran aus und inzwischen gibt es auch ganz nette API-Beschreibungen für numpy.)
Ich nutze allerdings eine Reihe alter Fortranprogramme, die ich gelegentlich auch modifiziere.
Zur eigentlichen Frage: Das erwähnte Programm generiert nur Eingabedateien für diese Fortranprogramme und fängt deren Ausgabe ab - mehr nicht. Eine echte Einbindung existiert nicht und wäre auch ein Overkill.

Nebenbei: Ich habe mich mal mit f2py beschäftigt und denke es ist nicht sonderlich schwer - jedenfalls habe ich es geschafft einfache Beispiele schnell zum Laufen zu bringen.

Gruß,
Christian
BlackJack

Donnerstag 7. September 2006, 15:18

Aber warum willst Du dann auf "Windows" testen? Wäre es nicht besser auf das vorhandensein des Fortranprogramms zu testen? Immerhin könnte es sein, dass doch jemand das Programm auf Windows installiert oder umgekehrt das Dein Code in einer Unixumgebung läuft, aber ohne das dort das Fortranprogramm installiert ist.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Donnerstag 7. September 2006, 17:24

Hoi BlackJack,

danke für Deine Einwände. Du könntest recht haben, aber:

ad a) Ich bin mir sicher, daß dieses Programm nur schwer auf Windows portiert werden kann. Und da ich es nicht tun werde und die Verbreitung meines Programms gering sein wird, ist die Frage, die ich gestellt habe, wohl diejenige, die am einfachsten zu beantworten ist. Wenn doch jemand das Programm portieren sollte (was für ein Trottel muß das sein?), wie erfahre ich unter welchem Namen es installiert ist? (Die Software ist 30 Jahre alt und die Benennung des Executables willkürlich.)
ad b) Das ist ein Problem auf das ich Nutzer gesondert hinweisen muß, mit der anderen Frage aber nichts zu tun hat. (Gibt es das Programm unter dem erwarteten Namen? Wenn nicht: Hinweis.) Aber noch eigentlicher ist dies irrelevant: Auf allen in Frage kommenden Rechnern ist es installiert und das werde ich testen, bevor irgend ein Student im Praktikum drangelassen wird ;-).

Gruß,
Christian
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Donnerstag 7. September 2006, 21:10

Hi Christian,

danke für deine Antwort. f2py ist wirklich einfach zu handhaben, ich verwende es auch gelegentlich. Kommt immer auf den Anwendungsfall an.
Es interessiert mich nur immer, wie andere die verschiedenen Programmiersprachen verbinden.

PS: Ich programmiere hauptsächlich in Fortran. Mit C kann ich mir irgendwie nicht anfreunden :)

Gruß, mawe
Antworten