web-dev-qa-db-ja.com

LinuxでPythonでエクスポートを使用する方法

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でエクスポートを実行するにはどうすればよいですか?

53
Kevin Campion

あなたは実際にやりたい

import os
os.environ["MY_DATA"] = "my_export"
68
Alex

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 ...コマンドを実行すると、変更された環境とともに破棄されます。

77
alex tingle

これを行う別の方法は、急いでいて、後味が気にならない場合は、bash環境でpythonスクリプトの出力を実行し、コマンドを出力することですPythonで環境の設定を実行します。理想的ではありませんが、ピンチで作業を完了できます。シェル間での移植性はあまり高くないため、YMMV.

$(python -c 'print "export MY_DATA=my_export"')

(一部のシェルのバックティックでステートメントを囲むこともできます ``)

13
mikepk

それほど単純ではありません:

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
7
phoku

素晴らしい答えがあります。

#! /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氏は、これらのプロセスとサブプロセスに関するものについて正しいです

それをどのように達成できるかは、上で述べたようなものです。キーコンセプトは次のとおりです。

  1. printed from pythonは、bash [output]のキャッチ変数の変数に格納されます。
  2. evalを使用して、文字列形式のコマンドを実行できます。
  3. したがって、意味のあるprintコマンドでpythonからbash出力を準備します
  4. evalを使用してbashで実行します

そして、あなたはあなたの結果を見ることができます

[〜#〜] note [〜#〜]常にdouble quotesを使用してevalを実行するか、bash\nsを台無しにしますそして出力は奇妙になります

PS:bashは好きではないが、あなたはそれを使わなければならない

1
Akhil Soni

代わりにos.environ ["MY_DATA"]を試すことができます。

1

ここでは特別なことを行うpythonではありませんが、同じサブシェルでexportコマンドを実行すると、おそらく望む結果が得られます。

import os

cmd = "export MY_DATA='1234'; echo $MY_DATA" # or whatever command
os.system(cmd)
0

一般的なシンフュージョンをより明確にするために...

私は多くの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
0
OriginalNewBee

ワンラインソリューション:

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呼び出し

python -c 'import sysconfig;print("python_include_path={0}".format(sysconfig.get_path("include")))'

pythonスクリプトを起動しています

  1. sysconfigをインポートします
  2. pythonこれに対応するパスをインクルードしますpython binary(使用されているPythonを確認するには「which python」を使用)
  3. {0}が2からのパスであるスクリプト「python_include_path = {0}」を出力します

評価呼び出し

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/

0
Alechan
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]

0
firejoker