Potrzebuję sposobu, aby powiedzieć, w jakim trybie znajduje się powłoka z powłoki.
Próbowałem spojrzeć na moduł platformy , ale wydaje się, że mówi tylko o „o architekturze bitowej i formacie powiązania używanym do pliku wykonywalnego”: plik binarny jest jednak skompilowany jako 64-bitowy (działam na systemie OS X 10.6), więc wydaje się, że zawsze zgłasza 64-bitowe, mimo że używam opisanych tutaj metod , aby wymusić tryb 32-bitowy).
Odpowiedzi:
Jednym ze sposobów jest spojrzenie,
sys.maxsize
jak udokumentowano tutaj :sys.maxsize
został wprowadzony w Pythonie 2.6. Jeśli potrzebujesz testu dla starszych systemów, ten nieco bardziej skomplikowany test powinien działać na wszystkich wersjach Python 2 i 3:BTW, możesz mieć ochotę do
platform.architecture()
tego. Niestety, jego wyniki nie zawsze są wiarygodne, szczególnie w przypadku OS X uniwersalnych plików binarnych .źródło
sys.maxsize
test dla Pythona 2.6+ istruct
test używany przezplatform
moduł, który działa również dla starszych wersji Pythona 2.Podczas uruchamiania interpretera Pythona w terminalu / wierszu poleceń możesz także zobaczyć linię:
Python 2.7.2 (default, Jun 12 2011, 14:24:46) [MSC v.1500 64 bit (AMD64)] on win32
Gdzie
[MSC v.1500 64 bit (AMD64)]
oznacza 64-bitowy Python. Działa dla mojej konkretnej konfiguracji.źródło
[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
. Dostaję na przykład('3.4.4 |Continuum Analytics, Inc.| (default, Feb 16 2016, 09:54:04) [MSC ' 'v.1600 64 bit (AMD64)]')
lub2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)]
Zasadniczo wariant odpowiedzi Matthew Marshalla (z struct z biblioteki std.library):
źródło
python -c "import struct; print(struct.calcsize('P')*8)"
Spróbuj użyć ctypów, aby uzyskać rozmiar pustego wskaźnika:
Będzie to 4 dla wersji 32-bitowej lub 8 dla wersji 64-bitowej.
źródło
python -c 'import ctypes; print ctypes.sizeof(ctypes.c_voidp)'
zwraca 8 . A może tak powinno byćpython -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')"
Otwórz konsolę python:
powinien wyświetlać „64-bitowy” lub „32-bitowy” w zależności od platformy.
Alternatywnie ( w przypadku plików binarnych OS X ):
źródło
Aby uzyskać rozwiązanie nieprogramowe, poszukaj w monitorze aktywności. Podaje architekturę 64-bitowych procesów jako „Intel (64-bit)”.
źródło
W moim systemie Centos Linux wykonałem następujące czynności:
1) Uruchomiłem interpreter Pythona (używam 2.6.6)
2) Uruchomiłem następujący kod:
i dało mi to
źródło
platform.architecture()
notatki mówią:źródło
Grupowanie wszystkiego ...
Biorąc pod uwagę, że:
Zamierzam zilustrować przykłady na wszystkich 3 platformach, używając Python 3 i Python 2 .
0x100000000
(2 ** 32
): większa dla wersji 64-bitowej , mniejsza dla wersji 32-bitowej :sizeof(void*)
):sizeof(void*)
). Uwaga: ctypes używa # 2. (niekoniecznie do tego zadania) za pośrednictwem „$ {PYTHON_SRC_DIR} / Lib / ctypes / __ init__.py” (wokół linii nr 15 ):Wygraj określone:
źródło
struct.calcsize("P")
zwraca rozmiar bajtów wymaganych do przechowywania pojedynczego wskaźnika. W systemie 32-bitowym zwróci 4 bajty. W systemie 64-bitowym zwróci 8 bajtów.Tak więc następujące informacje będą zwracane,
32
jeśli używasz 32-bitowego Pythona i64
jeśli używasz 64-bitowego Pythona:Python 2
Python 3
źródło
Wykonaj a
python -VV
w wierszu poleceń. Powinien zwrócić wersję.źródło
po uderzeniu w python w cmd
źródło
3.5.1 (v3.5.1: 37a07cee5969, 6 grudnia 2015, 01:54:25) [MSC v.1900 64 bit (AMD64) ]
źródło
Na podstawie odpowiedzi abe32
n_bity będą miały 32 lub 64 bity.
źródło
Dla wersji 32-bitowej zwraca 32, a dla wersji 64-bitowej zwraca 64
źródło
Architektura platformy nie jest niezawodnym sposobem. Zamiast nas:
źródło
platform.architecture()
jest problematyczne (i drogie).Dogodnie przetestuj
sys.maxsize > 2**32
od wersji Py2.6.Jest to wiarygodny test dla rzeczywistej (domyślnie) wielkości wskaźnika i zgodne przynajmniej od Py2.3:
struct.calcsize('P') == 8
. Również:ctypes.sizeof(ctypes.c_void_p) == 8
.Uwagi: Mogą być kompilacje z opcją gcc
-mx32
lub podobną, które są aplikacjami architektury 64-bitowej, ale domyślnie używają wskaźników 32-bitowych (oszczędzanie pamięci i prędkości). 'sys.maxsize = ssize_t' nie może ściśle reprezentować rozmiaru wskaźnika C (zwykle2**31 - 1
tak jest). I były / są systemy, które mają różne rozmiary wskaźników dla kodu i danych i należy wyjaśnić, jaki dokładnie jest cel rozpoznania „trybu 32-bitowego lub 64-bitowego”?źródło