Cách gọi. /home/test.sh tệp trong tập lệnh python
Tôi có tệp được gọi là . /home/test.sh(khoảng trống giữa tệp đầu tiên .và /có chủ định) chứa một số biến môi trường. Tôi cần tải tệp này và chạy .py. Nếu tôi chạy lệnh theo cách thủ công trước tiên trên máy chủ Linux và sau đó chạy tập lệnh python, nó sẽ tạo ra đầu ra cần thiết. Tuy nhiên, tôi muốn gọi . /home/test.shtừ bên trong python để tải hồ sơ và chạy phần còn lại của mã. Nếu hồ sơ này không được tải, các tập lệnh python sẽ chạy và đưa ra kết quả là 0.
Cuộc gọi
subprocess.call('. /home/test.sh',shell=True)
chạy tốt nhưng hồ sơ không được tải trên thiết bị đầu cuối Linux để thực thi mã python và đưa ra kết quả mong muốn.
Ai đó có thể giúp đỡ?
Trả lời
Các biến môi trường không được kế thừa trực tiếp bởi quy trình mẹ, đó là lý do tại sao cách tiếp cận đơn giản của bạn không hoạt động.
Nếu bạn đang cố gắng chọn các biến môi trường đã được đặt trong của mình test.sh, thì một điều bạn có thể làm thay vào đó là sử dụng envtrong một trình bao con để viết chúng vào stdout sau khi tìm nguồn cung cấp tập lệnh và sau đó trong Python, bạn có thể phân tích cú pháp các biến này và đặt chúng cục bộ.
Đoạn mã dưới đây sẽ hoạt động miễn là test.shnó không tự ghi bất kỳ đầu ra nào. (Nếu có, thì những gì bạn có thể làm để khắc phục nó là đối với echomột số chuỗi phân tách sau đó tìm nguồn cung cấp nó và trước khi chạy env, và sau đó trong mã Python, hãy loại bỏ chuỗi phân tách và mọi thứ trước nó.)
import subprocess
import os
p = subprocess.Popen(". /home/test.sh; env -0", shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out, _ = p.communicate()
for varspec in out.decode().split("\x00")[:-1]:
pos = varspec.index("=")
name = varspec[:pos]
value = varspec[pos + 1:]
os.environ[name] = value
# just to test whether it works - output of the following should include
# the variables that were set
os.system("env")
Cũng cần xem xét rằng nếu tất cả những gì bạn muốn làm là đặt một số biến môi trường mỗi lần trước khi bạn chạy bất kỳ mã python nào, thì một tùy chọn chỉ là lấy nguồn của bạn test.shtừ trình bao bọc tập lệnh shell và không cố gắng đặt chúng bên trong python ở tất cả:
#!/bin/sh
. /home/test.sh
exec "/path/to/your/python/script $@"
Sau đó, khi bạn muốn chạy mã Python, bạn hãy chạy trình bao bọc.