2008-11-04 30 views
15

Trong Linux Khi tôi gọi python từ vỏ nó sao chép môi trường của nó, và bắt đầu quá trình python. Do đó, nếu tôi thực hiện một số việc như sau:Có thể thay đổi Môi trường của quy trình gốc trong python không?

import os 
os.environ["FOO"] = "A_Value" 

Khi quá trình python trả về, FOO, giả sử nó chưa được xác định ban đầu, sẽ vẫn chưa được xác định. Có cách nào cho quá trình python (hoặc bất kỳ quá trình con) để sửa đổi môi trường của quá trình cha mẹ của nó?

Tôi biết bạn thường giải quyết vấn đề này bằng một cái gì đó giống như

source script_name.sh 

Nhưng cuộc xung đột này với các yêu cầu khác tôi có.

+0

Xem câu hỏi liên quan này: http://stackoverflow.com/questions/205064/is-there-a-way-to-change-another-processs-environment-variables – Davide

+0

Andrew từ chủ đề đó đã trả lời: Thông qua gdb: (gdb) đính kèm PROCESS_ID (gdb) gọi putenv ("env_var_name = env_var_value") (gdb) tách này là khá một hack khó chịu và chỉ nên được thực hiện trong bối cảnh của một kịch bản gỡ rối, tất nhiên . – grieve

Trả lời

14

Không quy trình nào có thể thay đổi quy trình gốc (hoặc bất kỳ môi trường nào của quy trình hiện có khác).

Tuy nhiên, bạn có thể tạo môi trường mới bằng cách tạo vỏ tương tác mới với môi trường đã sửa đổi.

Bạn phải sinh ra một bản sao vỏ mới có sử dụng môi trường được nâng cấp và có quyền truy cập vào stdin hiện tại, stdout và stderr, và thực hiện nhảy reinitialization của nó.

Bạn cần làm điều gì đó như sử dụng tiến trình con. Mở để chạy /bin/bash -i.

Vì vậy, vỏ gốc chạy Python, chạy trình bao mới. Có, bạn có rất nhiều quy trình đang chạy. Không có nó không quá tệ bởi vì shell gốc và Python không thực sự làm bất cứ điều gì ngoại trừ việc đợi subshell kết thúc để chúng có thể thoát ra một cách rõ ràng.

+0

Vâng, đây là những gì tôi hiện đang làm. Tôi đã cố tránh điệu nhảy khởi tạo lại đó. – grieve

+0

Tôi đã chỉnh sửa bài đăng của bạn sửa một số lỗi chính tả và thêm nhận xét được lồng tiếng (bạn có thể muốn xóa nhận xét đó nếu bạn không đồng ý) – tzot

+1

Thay đổi quy trình "hiện có" - trong khi đúng - là tiếp tuyến. Thay đổi tiến trình cha mẹ là điều làm cho mọi người lẫn lộn; nó không rõ ràng cho mọi người rằng tất cả các lệnh * nix đang chạy trong một tiến trình con. –

13

Không thể, đối với bất kỳ quy trình con nào, để thay đổi môi trường của quy trình gốc. Điều tốt nhất bạn có thể làm là đưa ra các câu lệnh shell để stdout mà sau đó bạn nguồn, hoặc viết nó vào một tệp mà bạn nguồn trong phụ huynh.

10

tôi sẽ sử dụng câu lệnh bash eval, và có python script đầu ra các mã shell

child.py:

#!/usr/bin/env python 
print 'FOO="A_Value"' 

parent.sh

#!/bin/bash 
eval `./child.py` 
Các vấn đề liên quan