2015-06-29 16 views
6

Tôi có một tập tin với một số biến môi trường mà tôi muốn sử dụng trong một kịch bản pythonbiến tải môi trường từ một kịch bản shell

Các công trình sau đây hình thành nên dòng lệnh

$ source myFile.sh 
$ python ./myScript.py 

và từ bên trong python tập lệnh Tôi có thể truy cập các biến như

import os 
os.getenv('myvariable') 

Làm cách nào để có thể mã nguồn của tập lệnh shell, sau đó truy cập các biến, từ tập lệnh python?

+0

Ý của bạn là gì? Bạn có nghĩa là làm thế nào để bạn * thiết lập * biến môi trường? – jonrsharpe

+0

tôi muốn gọi 'source myFile.sh' từ bên trong kịch bản python và sau đó truy cập vào các biến – lafferc

+0

Vì vậy, bạn chỉ muốn biết cách chạy lệnh từ Python? Bạn đã thử tìm kiếm * đó * chưa? * "tải biến môi trường" * có vẻ ** hoàn toàn ngẫu nhiên ** đối với những gì bạn đang cố gắng đạt được. – jonrsharpe

Trả lời

9

Nếu bạn đang nói tuyên truyền môi trường lạc hậu, xin lỗi, bạn không thể. Đó là một vấn đề an ninh. Tuy nhiên, môi trường nguồn trực tiếp từ python chắc chắn là hợp lệ. Nhưng nó ít nhiều là một quy trình thủ công.

import subprocess as sp 

SOURCE = 'your_file_path' 
proc = sp.Popen(['bash', '-c', 'source {} && env'.format(SOURCE)], stdout=sp.PIPE) 

source_env = {tup[0].strip(): tup[1].strip() for tup in map(lambda s: s.strip().split('=', 1), proc.stdout)} 

Sau đó, bạn có mọi thứ bạn cần trong source_env.

Nếu bạn cần phải viết nó trở lại môi trường địa phương của bạn (mà không được khuyến khích, vì source_env giúp bạn sạch):

import os 

for k, v in source_env.items(): 
    os.environ[k] = v 

Một chú ý nhỏ cần phải được thanh toán ở đây, là vì tôi gọi là bash ở đây, bạn nên mong đợi các quy tắc được áp dụng ở đây. Vì vậy, nếu bạn muốn biến của bạn được nhìn thấy, bạn sẽ cần phải xuất chúng.

export VAR1='see me' 
VAR2='but not me' 
+1

Điều đó sẽ không hoạt động đúng cho tất cả các giá trị biến môi trường có thể có - đầu ra của 'env' không có ý định phân tích cú pháp một cách rõ ràng. –

+1

@CharlesĐúng đúng. có những trường hợp góc. một cách có thể thực sự đối phó với nó sẽ cần một tập lệnh khác để in 'k = v' được giới hạn bởi' \ 0'. – HuStmpHrrr

+0

Thật vậy. Người ta thậm chí có thể 'cat/proc/self/environ', sẽ phát ra chính xác định dạng đó, nếu hệ điều hành duy nhất cần được hỗ trợ là Linux. :) –

-2

Bạn có thể không phải tải biến môi trường nói chung từ tập lệnh bash hoặc shell, đó là ngôn ngữ khác. Bạn sẽ phải sử dụng bash để đánh giá các tập tin và sau đó bằng cách nào đó in ra các biến và sau đó đọc chúng. xem Forcing bash to expand variables in a string loaded from a file

Các vấn đề liên quan