Pythonでこのようなエクスポートを行う必要があります。
# export MY_DATA="my_export"
私がやろうとしました:
# -*- python-mode -*-
# -*- coding: utf-8 -*-
import os
os.system('export MY_DATA="my_export"')
しかし、エクスポートをリストすると、「MY_DATA」は表示されません:
# export
「my_export」をファイルに保存せずにPythonでエクスポートを実行するにはどうすればよいですか?
あなたは実際にやりたい
import os
os.environ["MY_DATA"] = "my_export"
export
は、シェルに直接与えるコマンド(例:bash
)で、環境変数の1つを追加または変更するように指示します。シェルの環境を子プロセス(Pythonなど)から変更することはできません。それは不可能です。
os.system('export MY_DATA="my_export"')
...を試してみてください.
/bin/bash process, command `python yourscript.py` forks python subprocess
|_
/usr/bin/python process, command `os.system()` forks /bin/sh subprocess
|_
/bin/sh process, command `export ...` changes local environment
一番下の/bin/sh
サブプロセスはexport ...
コマンドを実行すると、変更された環境とともに破棄されます。
これを行う別の方法は、急いでいて、後味が気にならない場合は、bash環境でpythonスクリプトの出力を実行し、コマンドを出力することですPythonで環境の設定を実行します。理想的ではありませんが、ピンチで作業を完了できます。シェル間での移植性はあまり高くないため、YMMV.
$(python -c 'print "export MY_DATA=my_export"')
(一部のシェルのバックティックでステートメントを囲むこともできます ``)
それほど単純ではありません:
python -c "import os; os.putenv('MY_DATA','1233')"
$ echo $MY_DATA # <- empty
しかし:
python -c "import os; os.putenv('MY_DATA','123'); os.system('bash')"
$ echo $MY_DATA #<- 123
素晴らしい答えがあります。
#! /bin/bash
output=$(git diff Origin/master..Origin/develop | \
python -c '
# DO YOUR HACKING
variable1_to_be_exported="Yo Yo"
variable2_to_be_exported="Honey Singh"
… so on
magic=""
magic+="export onShell-var1=\""+str(variable1_to_be_exported)+"\"\n"
magic+="export onShell-var2=\""+str(variable2_to_be_exported)+"\""
print magic
'
)
eval "$output"
echo "$onShell-var1" // Output will be Yo Yo
echo "$onShell-var2" // Output will be Honey Singh
Alex Tingle氏は、これらのプロセスとサブプロセスに関するものについて正しいです
それをどのように達成できるかは、上で述べたようなものです。キーコンセプトは次のとおりです。
printed
from pythonは、bash
[output
]のキャッチ変数の変数に格納されます。eval
を使用して、文字列形式のコマンドを実行できます。print
コマンドでpythonからbash
出力を準備しますeval
を使用してbashで実行しますそして、あなたはあなたの結果を見ることができます
[〜#〜] note [〜#〜]常にdouble quotes
を使用してeval
を実行するか、bash
が\n
sを台無しにしますそして出力は奇妙になります
PS:bashは好きではないが、あなたはそれを使わなければならない
代わりにos.environ ["MY_DATA"]を試すことができます。
ここでは特別なことを行うpythonではありませんが、同じサブシェルでexportコマンドを実行すると、おそらく望む結果が得られます。
import os
cmd = "export MY_DATA='1234'; echo $MY_DATA" # or whatever command
os.system(cmd)
一般的なシンフュージョンをより明確にするために...
私は多くのpython <-> bash <-> elfbinツールチェーンを書きましたが、それを確認する適切な方法は次のようなものです:
各プロセス(発信元)には、それを呼び出したものから継承された環境の状態があります。変更は、そのプロセスにとどまるままです。環境状態の転送はそれ自体が機能であり、2つの方向に実行されます。それぞれに注意事項があります。最も一般的なことは、サブプロセスを実行する前に環境を変更することです。メタルに進むには、exec()-Cの呼び出しを見てください。環境データへのポインターを取るバリアントがあります。これは、典型的なOSで実際にサポートされている環境の転送のみです。
シェルスクリプトは、exportを実行すると、子を実行するときに渡す状態を作成します。それ以外の場合は、最初に取得したものを使用します。
他のすべての場合では、子プロセス出力の結果に基づいて呼び出しプロセス自体が環境を更新できるように、データのセットを渡すために使用される一般的なメカニズムになります。
例:
ENVUPDATE = $(CMD_THAT_OUTPUTS_KEYVAL_LISTS)
echo $ENVUPDATE > $TMPFILE
source $TMPFILE
もちろん、json、xml、または他のものを使用して、解釈および適用するツールがあれば同じことができます。
これの必要性は、(50%の確率で)基本的なプリミティブが誤って構築されている兆候であり、ソリューションでより良い構成またはパラメーターの交換が必要であることです。
ああ、python私は次のようなことをします...(状況に応じて改善が必要です)
import re
RE_KV=re.compile('([a-z][\w]*)\s*=\s*(.*)')
OUTPUT=RunSomething(...) (Assuming 'k1=v1 k2=v2')
for kv in OUTPUT.split(' ')
try:
k,v=RE_KV.match(kv).groups()
os.environ[k]=str(v)
except:
#The not a property case...
pass
eval `python -c 'import sysconfig;print("python_include_path={0}".format(sysconfig.get_path("include")))'`
echo $python_include_path # prints /home/<usr>/anaconda3/include/python3.6m" in my case
python -c 'import sysconfig;print("python_include_path={0}".format(sysconfig.get_path("include")))'
pythonスクリプトを起動しています
eval `python -c 'import sysconfig;print("python_include_path={0}".format(sysconfig.get_path("include")))'`
現在のbashインスタンスでpythonスクリプトからの出力を実行しています。私の場合、その実行は:
python_include_path=/home/<usr>/anaconda3/include/python3.6m
つまり、環境変数「python_include_path」にこのシェルインスタンスのパスを設定しています。
インスピレーション: http://blog.tintoy.io/2017/06/exporting-environment-variables-from-python-to-bash/
import os
import shlex
from subprocess import Popen, PIPE
os.environ.update(key=value)
res = Popen(shlex.split("cmd xxx -xxx"), stdin=PIPE, stdout=PIPE, stderr=PIPE,
env=os.environ, Shell=True).communicate('y\ny\ny\n'.encode('utf8'))
stdout = res[0]
stderr = res[1]