Chạy chương trình với môi trường được đặt thành các biến trong một tệp


7

Tôi muốn chạy một chương trình (trong trường hợp này là Python) chỉ với các biến môi trường được xác định trong một tệp, nói vars.env:

FOO=bar
X=12

Đây là một tập lệnh Python đơn giản in ra môi trường:

import os
print os.environ

Nếu tôi chạy env -i python script.py, os.envir trống như mong đợi. Tương tự như vậy, nếu tôi chạy

$ env -i FOO=bar X=12 python env.py

tôi có

env: {'X': '12', 'FOO': 'bar'}

Tuy nhiên, những gì tôi muốn làm là tải môi trường từ vars.envtệp của tôi khi chạy tập lệnh. Làm thế nào tôi có thể thực hiện điều này?

EDIT: Một điều mà tôi có thể làm là gửi tệp env này, env -i `cat vars.env` python env.pynhưng tôi thích có thể lấy nó theo một cách nào đó.


Tôi không hiểu câu hỏi: có vẻ như bạn đã tìm thấy một cách để chương trình chạy chương trình với môi trường được đặt thành các biến trong một tập tin. Là câu hỏi làm thế nào để làm điều đó từ bên trong tập lệnh Python, để bạn có thể trực tiếp chạy /path/to/myscript.py?
Gilles 'SO- ngừng trở thành ác quỷ'

Câu trả lời:


5

Đưa ra tệp bạn hiển thị, bạn sẽ có thể làm:

(set -f ; IFS='
' ; env - $(cat /path/to/file) /path/to/your/program
)

Nếu nó không hoạt động thì đó chỉ là do bạn cần định dạng tệp môi trường của mình trước. Đây là một ví dụ:

(set -f ; IFS='
' ; env - $(cat) printenv 
) <<\ENV
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
ENV
###OUTPUT###
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore

Lúc đầu tôi nghĩ bạn có thể làm điều đó thông qua trình bao - nhưng có lẽ nó sẽ thiết lập một số môi trường riêng trước khi gọi chương trình của bạn. Nhưng ít nhất tôi có thể chứng minh rằng các đối số được gán chính xác:

(set -f; IFS='
' ; env - $(cat) sh -c 'echo "$variable3"'
) <<\ENV
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
ENV
###OUTPUT###
value3 an$d s'om\e m"ore

Tuy nhiên, nếu bạn muốn tìm nguồn này, đây là cách bạn có thể sử dụng shell:

(echo '$1'; cat; echo '$2') <<\ENV |\
env - sh -s -- 'set -a' printenv
variable1=value1
variable2=value2
variable3='value3 an$d s'\''om\e m"ore'
ENV
###OUTPUT###
PWD=/home/mikeserv/test
SHLVL=1
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
_=/usr/bin/printenv

Lưu ý rằng tôi đã xóa $IFSnội dung - điều đó không cần thiết theo cách này - nhưng tôi đã phải nhận được cụ thể về các trích dẫn trong tệp. Ở đây tôi chủ yếu .dottìm nguồn cung ứng stdin- đọc phần |pipeđầu vào - nhưng bạn có thể sử dụng bất kỳ tệp nào. Tôi sử dụng set -atrước khi đọc các tập tin đầu vào để thiết lập --allexporttùy chọn.

Đó là kết quả của việc sử dụng bash's sh- nó cho biết thêm $PWD, $SHLVL$_. Với dashnó là tốt hơn một chút. Và dashcũng không thêm một loạt các bản xuất, vì vậy bạn có thể chỉ định -atham số trên dòng lệnh:

(cat; echo '$1') <<\ENV |\
env - dash -sa -- printenv 
variable1=value1
variable2=value2
variable3='value3 an$d s'\''om\e m"ore'
ENV
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
PWD=/home/mikeserv/test

Chỉ $PWDđi qua.


1

Bạn có thể làm tất cả trong Python:

$ cat config.py
env = {
    'FOO' : 'bar',
    'X'   : '12',
}

$ cat test.py
import os
import config

os.environ.clear()
os.environ.update(config.env)
print os.environ

Sau đó:

$ python test.py
{'X': '12', 'FOO': 'bar'}

1

Một cách khác là đọc tệp thành một mảng và sau đó sử dụng mảng làm đối số. Ưu điểm so với việc sử dụng thay thế quá trình là nó có thể xử lý các giá trị với khoảng trắng trong chúng. Thí dụ:

$ cat file
FOO=bar
X=12
var=a b c

$ IFS=$'\n' read -d '' -ra vars < file
$ env -i "${vars[@]}" python env.py
{'var': 'a b c', 'X': '12', 'FOO': 'bar'}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.