2013-07-02 39 views
20

Tôi đang chạy tập lệnh bash (test.sh) và nó tải trong biến môi trường (từ env.sh). Điều đó hoạt động tốt, nhưng tôi đang cố gắng để xem python chỉ có thể tải trong các biến đã có trong kịch bản bash. Có, tôi biết nó có lẽ sẽ dễ dàng hơn khi chỉ chuyển qua các biến cụ thể mà tôi cần làm đối số, nhưng tôi đã tò mò liệu có thể có được các biến bash hay không.Đọc các biến Bash thành tập lệnh Python

test.sh

#!/bin/bash 
source env.sh 

echo $test1 

python pythontest.py 

env.sh

#!/bin/bash 

test1="hello" 

pythontest.py

? 
print test1 (that is what I want) 

Trả lời

29

Bạn cần phải xuất khẩu các biến trong bash, hoặc họ sẽ được địa phương để bash :

export test1 

Sau đó, trong python

import os 
print os.environ["test1"] 
+0

Tôi tò mò, có cách nào dễ dàng để xuất tất cả các biến không? –

+1

@TallPaul Từ điển 'os.environ' đã chứa tất cả các biến mà chương trình có thể nhìn thấy. – Bakuriu

+8

'set -a; nguồn env.sh; set + a'. Tùy chọn '-a' chỉ thị' bash' xuất mỗi biến mới cho đến khi bạn tắt nó với '+ a'. – chepner

4

Giả sử các biến môi trường được thiết lập là vĩnh viễn, mà tôi nghĩ rằng họ không. Bạn có thể sử dụng os.environ.

os.environ["something"] 
+0

John làm cách nào để đặt biến vĩnh viễn? –

+0

thêm 'set -a' trước lệnh' ource' (trên một dòng riêng biệt). Điều này nói rằng, từ bây giờ, bất kỳ tập hợp biến nào sẽ tự động được xuất. –

+1

@TallPaul, giống như AMADANON Inc. nói. Tuy nhiên bạn có thể thiết lập các biến cho môi trường hiện tại [từ python] (http://stackoverflow.com/a/1339904/322909). – John

1

Có một cách khác sử dụng subprocess mà không phụ thuộc vào thiết lập môi trường. Tuy nhiên, với một ít mã hơn.

Đối với một kịch bản shell trông giống như sau:

#!/bin/sh 
myvar="here is my variable in the shell script" 

function print_myvar() { 
    echo $myvar 
} 

Bạn có thể lấy giá trị của biến hoặc thậm chí gọi một hàm trong shell script như trong mã Python sau:

import subprocess 

def get_var(varname): 
    CMD = 'echo $(source myscript.sh; echo $%s)' % varname 
    p = subprocess.Popen(CMD, stdout=subprocess.PIPE, shell=True, executable='/bin/bash') 
    return p.stdout.readlines()[0].strip() 

def call_func(funcname): 
    CMD = 'echo $(source myscript.sh; echo $(%s))' % funcname 
    p = subprocess.Popen(CMD, stdout=subprocess.PIPE, shell=True, executable='/bin/bash') 
    return p.stdout.readlines()[0].strip() 

print get_var('myvar') 
print call_func('print_myvar') 

Lưu ý rằng cả hai shell=True phải được thiết lập để xử lý lệnh shell trong CMD để được xử lý như hiện tại và đặt executable='bin/bash' để sử dụng thay thế quy trình, không được hỗ trợ bởi mặc định /bin/sh.

+0

Điều này làm việc hoàn hảo! –

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