Bagaimana cara menelepon. /home/test.sh dalam skrip python

Sep 11 2020

Saya memiliki file bernama . /home/test.sh(spasi antara yang pertama .dan /disengaja) yang berisi beberapa variabel lingkungan. Saya perlu memuat file ini dan menjalankan .py. Jika saya menjalankan perintah secara manual terlebih dahulu di server Linux dan kemudian menjalankan skrip python, itu menghasilkan output yang diperlukan. Namun, saya ingin memanggil . /home/test.shdari dalam python untuk memuat profil dan menjalankan sisa kode. Jika profil ini tidak dimuat skrip python berjalan dan memberikan 0 sebagai output.

Panggilan

subprocess.call('. /home/test.sh',shell=True)

berjalan dengan baik tetapi profil tidak dimuat di terminal Linux untuk mengeksekusi kode python dan memberikan keluaran yang diinginkan.

Bisakah seseorang membantu?

Jawaban

2 alani Sep 12 2020 at 05:10

Variabel lingkungan tidak diwarisi secara langsung oleh proses induk, itulah sebabnya pendekatan sederhana Anda tidak berfungsi.

Jika Anda mencoba mengambil variabel lingkungan yang telah ditetapkan di Anda test.sh, maka satu hal yang dapat Anda lakukan adalah menggunakan envsub-shell untuk menuliskannya ke stdout setelah mengambil skrip, dan kemudian dengan Python Anda dapat mengurai ini dan atur secara lokal.

Kode di bawah ini akan berfungsi asalkan test.shtidak menulis output apa pun itu sendiri. (Jika ya, maka apa yang dapat Anda lakukan untuk mengatasinya adalah ke echobeberapa string pemisah setelah mengambilnya, dan sebelum menjalankan env, dan kemudian dalam kode Python, lepaskan string pemisah dan semua yang sebelumnya.)

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")

Perlu juga dipertimbangkan bahwa jika semua yang ingin Anda lakukan adalah mengatur beberapa variabel lingkungan setiap kali sebelum Anda menjalankan kode python apa pun, maka salah satu opsi adalah untuk mengambil sumber Anda test.shdari pembungkus skrip-shell, dan tidak mencoba mengaturnya di dalam python sama sekali:

#!/bin/sh
. /home/test.sh
exec "/path/to/your/python/script $@"

Kemudian ketika Anda ingin menjalankan kode Python, Anda menjalankan wrapper sebagai gantinya.