1

シェル スクリプトを python に変換し、次のことを実行するための最良の方法を見つけようとしています。読む必要のある環境変数が含まれているため、これが必要です。

if [ -e "/etc/rc.platform" ];
then
    . "/etc/rc.platform"
fi

「if」を変換しましたが、. ソースの「/etc/rc.platform」はシェルコマンドです。これまでのところ、私は以下を持っています

if os.path.isfile("/etc/rc.platform"):
    print "exists" <just to verify the if if working>
    <what goes here to replace "source /etc/rc.platform"?>

subprocess と execfile を調べましたが、成功しませんでした。

Python スクリプトは、rc.platform によって設定された環境変数にアクセスする必要があります。

4

5 に答える 5

3

ややハックな解決策は、env出力を解析することです。

newenv = {}
for line in os.popen('. /etc/rc.platform >&/dev/null; env'):
    try:
        k,v = line.strip().split('=',1)
    except:
        continue  # bad line format, skip it
    newenv[k] = v
os.environ.update(newenv)

編集:@l4mpiのおかげで分割引数を修正

于 2013-03-07T19:05:34.803 に答える
1

(これは彼のコメントで説明されているソリューションcrayzeewulfのデモンストレーションです。)

環境変数のみが含まれている場合/etc/rc.platformは、それらを読み取り、Pythonプロセスの環境変数として設定できます。

このファイルを考えると:

$ cat /etc/rc.platform
FOO=bar
BAZ=123

環境変数の読み取りと設定:

>>> import os
>>> with open('/etc/rc.platform') as f:
...     for line in f:
...         k, v = line.split('=')
...         os.environ[k] = v.strip()
... 
>>> os.environ['FOO']
'bar'
>>> os.environ['BAZ']
'123'
于 2013-03-07T17:48:08.890 に答える
0

帰りに仕事が多すぎる。小さなシェルスクリプトを保持して、必要なすべての環境変数を取得し、それらを Python に読み込むのを忘れます。

于 2013-03-11T23:24:30.323 に答える
-1

sourceはシェルビルトインであるため、呼び出すときに設定する必要がありshell=Trueますsubprocess.call

>>> import os
>>> import subprocess
>>> if os.path.isfile("/etc/rc.platform"):
...     subprocess.call("source /etc/rc.platform", shell=True)

ここで何をしようとしているのかわかりませんが、それでも言及したいと思います。/etc/rc.platformいくつかのシェル関数をエクスポートして、内の他のスクリプトで使用できるようにする可能性がありますrc.d。これらはシェル関数であるため、によって呼び出されたシェルインスタンスにのみエクスポートされ、subprocess.call()別のsubprocess.call()を呼び出すと、新しいスクリプトを呼び出すために新しいシェルを生成するため、これらの関数は使用できなくなります。

于 2013-03-07T16:26:38.423 に答える
-1

これを試して:

if os.path.exists ("/etc/rc.platform"):
    os.system("/etc/rc.platform")
于 2013-03-07T16:25:52.733 に答える