Kann es für den aktuellen Prozess geändert werden, indem man es einfach auf einen neuen Wert setzt?Kann os.environ ['PYTHONHASHSEED'] dynamisch aus einer Anwendung heraus gesetzt werden?
os.environ['PYTHONHASHSEED'] = 'random'
Kann es für den aktuellen Prozess geändert werden, indem man es einfach auf einen neuen Wert setzt?Kann os.environ ['PYTHONHASHSEED'] dynamisch aus einer Anwendung heraus gesetzt werden?
os.environ['PYTHONHASHSEED'] = 'random'
Es hängt davon ab, was Sie meinen.
Wenn Sie meinen, das Verhalten des aktuellen Interpreter als die Antwort zu ändern, ist keine:
Ändern os.environ
nicht zuverlässig ist, da in einigen OSes Sie die Umgebung nicht ändern können (siehe Dokumentation für os.environ
).
Die Umgebungsvariablen werden nur beim Start des Interpreters auf geprüft, so dass sie nach dem Ändern keine Auswirkungen auf die aktuelle Python-Instanz haben. Von the documentation:
beeinflussen Diese Umgebungsvariablen Python Verhalten, sie vor der Befehlszeile verarbeitet sind Schaltern außer
-E
oder-I
.
(was bedeutet, dass sie nur beim Starten des Interpreters überprüft werden, lange bevor ein Benutzercode ausgeführt wird).
AFAIK, der zufällige Hash-Samen nicht dynamisch eingestellt werden, so dass Sie den Interpreter neu starten, wenn Sie Hash-Randomisierung aktiviert werden sollen.
Wenn Sie meinen, neue Prozesse gelaicht durch den aktuellen Interpreter verhalten, als ob dieser Wert vor, dann ja, unter der Annahme festgelegt wurde, dass Sie auf einer Plattform laufen, die putenv
unterstützt. Wenn ein neuer Prozess erstellt wird, übernimmt er standardmäßig die Umgebung des aktuellen Prozesses. Sie können dies testen, ein einfaches Skript:
#check_environ.py
import os
import subprocess
os.environ['A'] = '1'
proc = subprocess.call(['python', '-c', 'import os;print(os.environ["A"])'])
Welche ergibt:
$ python check_environ.py
1
Hinweis, dass es existiert bekannte Fehler in putenv
Implementierungen (zum Beispiel in Mac OS X), wo es Speicherlecks. Das Ändern der Umgebung ist also etwas, das Sie so weit wie möglich vermeiden möchten.
Mit 'subprocess.call' können Sie umgehen, indem Sie die Umgebung ändern, indem Sie eine explizite, erweiterte Umgebung übergeben. 'e = dict (os.environ); e.update (PYTHONHASHSEED = 'zufällig'); subprocess.call ([...], env = e) ' – chepner
@chepner Ja, das weiß ich gut. Es ist in den Dokumenten eindeutig erwähnt. Ich habe eine Frage zum * Ändern * der Umgebung * des aktuellen Prozesses * beantwortet. Tatsächlich ist dieser Teil der Antwort eine Vermutung darüber, was das OP bedeuten könnte; Wenn er seine Frage bearbeitet und klarstellt, was er meint, werde ich diesen Vorschlag hinzufügen (dies war bereits in meinen Gedanken, als ich die Antwort zum ersten Mal schrieb). – Bakuriu