Python: Cara independen platform untuk mengubah variabel lingkungan PATH


Jawaban:


174

Anda harus bisa memodifikasi os.environ.

Karena os.pathsepmerupakan karakter untuk memisahkan jalur yang berbeda, Anda harus menggunakan ini untuk menambahkan setiap jalur baru:

os.environ["PATH"] += os.pathsep + path

atau, jika ada beberapa jalur untuk ditambahkan ke dalam daftar:

os.environ["PATH"] += os.pathsep + os.pathsep.join(pathlist)

Seperti yang Anda sebutkan, os.path.joinjuga dapat digunakan untuk setiap jalur individu yang harus Anda tambahkan jika Anda harus membangunnya dari bagian yang terpisah.


Bagaimana dengan pemisah lingkungan PATH? ? linux - / usr / bin: / lib: ":" windows - C: \ asdf \; C: \ Prog ...; ";"
bua

2
@bua: maksud Anda yang os.pathsepsaya sebutkan (khusus untuk PATH)?
RedGlyph

@RedGlyph Ya, maaf saya pikir os.pathsep adalah "/" dan "\". Saya tidak memeriksanya sebelum mengklaim;).
bua

11
@bua: Ini hampir seperti "gotcha" os.path.sep != os.pathsep.
krawyoti

@krawyoti, bua: Ah, sekarang aku mengerti ... terlihat bagus! Ini memang kesalahan yang mudah :-)
RedGlyph

18

Harap dicatat bahwa os.environitu sebenarnya bukan kamus. Ini adalah objek seperti kamus khusus yang benar-benar menetapkan variabel lingkungan dalam proses saat ini menggunakan setenv .

>>> os.environ.__class__
<class os._Environ at 0x100472050>
>>> import os
>>> os.environ["HELLO"] = "WORLD"
>>> os.getenv("HELLO")
'WORLD'

Ini berarti bahwa PATH(dan variabel lingkungan lainnya) akan terlihat oleh kode C yang dijalankan dalam proses yang sama.

(Karena komentar tidak dapat berisi pemformatan, saya harus meletakkan ini dalam sebuah jawaban, tetapi saya merasa ini adalah hal yang penting untuk dibuat. Ini sebenarnya adalah komentar pada komentar tentang tidak adanya padanan dengan 'ekspor' .)


6

Peringatan yang harus diperhatikan dengan memodifikasi variabel lingkungan dengan Python, adalah bahwa tidak ada yang setara dengan perintah shell "ekspor". Tidak ada cara untuk memasukkan perubahan ke dalam proses saat ini, hanya proses anak.


+1: Bijaksana untuk menunjukkan bahwa, perintah seperti os.system, os.popenatau subprocess.Popenkemudian harus digunakan dari aplikasi Python untuk meluncurkan proses lain. Kalau tidak, itu tidak ada gunanya.
RedGlyph

4
Klarifikasi Pernyataan Glyph ini: ini tidak benar karena perubahan yang disuntikkan ke dalam proses saat ini (yang merupakan proses python). OP kemungkinan berarti tidak ada cara untuk memasukkan perubahan ke dalam proses induk (yang biasanya merupakan shell tempat skrip python dijalankan).
PonyEars

4
Jika itu yang dimaksud OP, maka shell juga tidak memiliki kemampuan ini; exportmenyebabkan variabel disalin ke lingkungan semua proses anak , tetapi tidak berpengaruh pada proses induk.
Kyle Strand
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.