Ich brauche eine Möglichkeit, um zu erkennen, in welchem Modus sich die Shell innerhalb der Shell befindet.
Ich habe versucht, mir das Plattformmodul anzusehen, aber es scheint Ihnen nur "über die Bitarchitektur und das für die ausführbare Datei verwendete Verknüpfungsformat" zu erzählen: Die Binärdatei ist jedoch als 64-Bit kompiliert (ich verwende OS X 10.6) Es scheint immer 64-Bit zu melden, obwohl ich die hier beschriebenen Methoden verwende , um den 32-Bit-Modus zu erzwingen.
Antworten:
Eine Möglichkeit besteht darin,
sys.maxsize
wie hier dokumentiert zu betrachten :sys.maxsize
wurde in Python 2.6 eingeführt. Wenn Sie einen Test für ältere Systeme benötigen, sollte dieser etwas kompliziertere Test auf allen Python 2- und 3-Versionen funktionieren:Übrigens könnten Sie versucht sein,
platform.architecture()
dies zu verwenden. Leider sind die Ergebnisse nicht immer zuverlässig, insbesondere bei universellen OS X-Binärdateien .quelle
sys.maxsize
grundlegend überarbeitet, um den jetzt dokumentierten Test für Python 2.6+ und denstruct
vomplatform
Modul verwendeten Test anzuzeigen, der auch für ältere Versionen von Python 2Wenn Sie den Python-Interpreter in der Terminal- / Befehlszeile starten, sehen Sie möglicherweise auch eine Zeile wie:
Python 2.7.2 (default, Jun 12 2011, 14:24:46) [MSC v.1500 64 bit (AMD64)] on win32
Wo
[MSC v.1500 64 bit (AMD64)]
bedeutet 64-Bit-Python. Funktioniert für mein spezielles Setup.quelle
[MSC v.1500 64 bit (AMD64)]
Python 2.7.8 (v2.7.8:ee879c0ffa11, Jun 29, 2014, 21:07:35) [GCC 4.2.1 (Apple In. build 5666) (dot 3)] on darwin
Python 2.7.8 (default, Jul 25 2014, 14:04:36) [GCC 4.8.3] on cygwin
sys.version
. Ich bekomme zum Beispiel('3.4.4 |Continuum Analytics, Inc.| (default, Feb 16 2016, 09:54:04) [MSC ' 'v.1600 64 bit (AMD64)]')
oder2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)]
Grundsätzlich eine Variante von Matthew Marshalls Antwort (mit Struktur aus der std.library):
quelle
python -c "import struct; print(struct.calcsize('P')*8)"
Versuchen Sie, mit ctypes die Größe eines leeren Zeigers zu ermitteln:
Es wird 4 für 32 Bit oder 8 für 64 Bit sein.
quelle
python -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp)'
kehrt 8 . Oder sollte es seinpython -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp) * 8'
?python -c "import ctypes; print(32 if ctypes.sizeof(ctypes.c_voidp)==4 else 64, 'bit CPU')"
Öffnen Sie die Python-Konsole:
Je nach Plattform sollte "64bit" oder "32bit" angezeigt werden.
Alternativ ( bei OS X-Binärdateien ):
quelle
Eine nicht programmatische Lösung finden Sie im Aktivitätsmonitor. Die Architektur von 64-Bit-Prozessen wird als "Intel (64-Bit)" aufgeführt.
quelle
Auf meinem Centos Linux-System habe ich Folgendes getan:
1) Den Python-Interpreter gestartet (ich verwende 2.6.6)
2) Den folgenden Code ausgeführt:
und es gab mir
quelle
platform.architecture()
Notizen sagen:quelle
Alles gruppieren ...
Bedenkt, dass:
Ich werde auf allen 3 Plattformen mit Python 3 und Python 2 veranschaulichen .
0x100000000
(2 ** 32
): größer für 64bit , kleiner für 32bit :sizeof(void*)
):sizeof(void*)
) zu bestimmen . Als Hinweis verwendet ctypes # 2. (nicht unbedingt für diese Aufgabe) über "$ {PYTHON_SRC_DIR} / Lib / ctypes / __ init__.py" (um Zeile 15 ):Gewinnen Sie spezifisch:
quelle
struct.calcsize("P")
Gibt die Größe der Bytes zurück, die zum Speichern eines einzelnen Zeigers erforderlich sind. Auf einem 32-Bit-System würde es 4 Bytes zurückgeben. Auf einem 64-Bit-System würde es 8 Bytes zurückgeben.Das Folgende würde also zurückkehren,
32
wenn Sie 32-Bit-Python ausführen und64
wenn Sie 64-Bit-Python ausführen:Python 2
Python 3
quelle
Machen Sie eine
python -VV
in der Kommandozeile. Es sollte die Version zurückgeben.quelle
3.5.1 (v3.5.1: 37a07cee5969, 6. Dezember 2015, 01:54:25) [MSC v.1900 64-Bit (AMD64) ]
quelle
nach dem schlagen von python in cmd
quelle
Basierend auf der Antwort von abe32,
n_bits haben 32 oder 64 Bit.
quelle
Für 32 Bit wird 32 und für 64 Bit 64 zurückgegeben
quelle
Plattformarchitektur ist nicht der zuverlässige Weg. Stattdessen wir:
quelle
platform.architecture()
ist problematisch (und teuer).Bequem testen für
sys.maxsize > 2**32
seit Py2.6.Dies ist ein zuverlässiger Test für die tatsächliche (Standard-) Zeigergröße und mindestens seit Py2.3 kompatibel :
struct.calcsize('P') == 8
. Auch :ctypes.sizeof(ctypes.c_void_p) == 8
.Hinweise: Es kann Builds mit der Option gcc
-mx32
oder so geben, bei denen es sich um 64-Bit-Architekturanwendungen handelt, die jedoch standardmäßig 32-Bit-Zeiger verwenden (Speicher und Geschwindigkeit sparen). 'sys.maxsize = ssize_t' repräsentiert möglicherweise nicht genau die C-Zeigergröße (normalerweise2**31 - 1
sowieso). Und es gab / gibt Systeme mit unterschiedlichen Zeigergrößen für Code und Daten, und es muss geklärt werden, was genau der Zweck ist, den "32-Bit- oder 64-Bit-Modus" zu erkennen.quelle