2013-09-28 339 views
24

Tôi đang trên ubuntu 13.04, bash, python2.7.4python - os.getenv và os.environ không thấy biến môi trường của tôi shell bash

Các thông dịch viên không thấy biến tôi đặt.

Dưới đây là một ví dụ:

$ echo $A 
5 
$ python -c 'import os; print os.getenv("A")' 
None 
$ python -c 'import os; print os.environ[ "A" ]' 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "/usr/lib/python2.7/UserDict.py", line 23, in __getitem__ 
    raise KeyError(key) 
KeyError: 'A' 

Nhưng mọi thứ hoạt động tốt với các PATH biến:

$ echo $PATH 
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games 
$ python -c 'import os; print os.getenv("PATH")' 
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games 

Và nó thông báo những thay đổi trong PATH:

$ PATH="/home/alex/tests/:$PATH" 
$ echo $PATH 
/home/alex/tests/:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games 
$ python -c 'import os; print os.getenv("PATH")' 
/home/alex/tests/:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games 

Điều gì có thể sai rồi?

PS vấn đề xảy ra khi sử dụng $PYTHONPATH:

$ python -c 'import os; print os.getenv("PYTHONPATH")' 
None 

Trả lời

56

Aha! giải pháp rất đơn giản!

Tôi đã đặt biến bằng lệnh $ A=5 đồng bằng; khi bạn sử dụng $ export B="kkk" mọi thứ đều ổn.

Đó là becauseexport làm biến sẵn cho quá trình phụ:

  • nó tạo ra một biến trong vỏ
  • xuất khẩu nó vào environment của vỏ
  • danh sách environment được chuyển đến các tiến trình con của trình bao.

Chỉ cần tạo biến trong trình bao và không làm bất kỳ điều gì với số environment.

Trình thông dịch được gọi từ trình bao lấy được số environment từ cấp độ gốc - vỏ. Vì vậy, thực sự biến sẽ được xuất vào environment trước đây.

+0

Thx, đã lưu cho tôi một số pouding đầu =) – Justin

4

Các biến đó (tham số trong thuật ngữ bash) không phải là môi trường biến. Bạn muốn xuất chúng vào môi trường, sử dụng export hoặc declare -x. Xem bash documentation on environment.

+0

hey! thuật ngữ mơ hồ: http://docs.python.org/2/using/cmdline.html#environment-variables – xealits

+0

Không chắc chắn bạn đang phàn nàn về điều gì, nhưng vấn đề nằm trong bash. Python không kiểm soát được các biến mà bash đặt trong môi trường. –

+0

Tôi có nghĩa là nếu đó là một "tham số" hoặc "biến" - không quan trọng với tôi. Tôi quan tâm đến việc thiết lập 'PYTHONPATH' để làm việc. Mặc dù, tôi thấy quan điểm của bạn - bạn có nghĩa là nhiệm vụ '$ A = 5' không tạo ra một biến môi trường nào cả. Có một danh sách các biến trong trình bao, được gọi là "môi trường". Nó được chuyển cho các tiến trình con. Và 'export' khai báo một số biến trong danh sách đó (xuất chúng vào trong đó). Phân công đồng bằng không tạo ra các biến trong danh sách đó - nó đặt chúng ở một nơi khác. Tôi sẽ sửa câu trả lời của tôi theo tất cả những điều này. – xealits