如何将变量从shell脚本传递给python脚本然后保存

时间:2013-11-14 11:28:36

标签: python django shell

我想问你们,如何将变量从shell脚本传递给python脚本,然后将其保存为局部变量。我在shell脚本中有一个变量:

#!/bin/bash
userpem=$(egrep "CN=$1/" index.txt|awk '{print $3}').pem
output='openssl x509 -in $userpem -noout -text'
export output

我在一些帖子上看到我可以用os.environ(foo)做到这一点,但我刚看到这样的例子:

from django.shortcuts import render
import os
import subprocess
from django.http import HttpResponse


def info(request, benutzername):
  os.chdir("/var/www/openvpn/examples/easy-rsa/2.0/keys")
  subprocess.Popen(["/var/www/openvpn/examples/easy-rsa/2.0/keys/getinfo.sh",benutzername])
  output = os.environ['output']
  return HttpResponse(output)

2 个答案:

答案 0 :(得分:1)

您需要使用os.environ['variablename']来处理环境变量。

例如,此处创建并导出v变量:

$ export v="hello"

让我们创建一个脚本a.py

import os

d=os.environ['v']
print "my environment var v is --> " + d

并称之为:

$ python a.py
my environment var v is --> hello

答案 1 :(得分:1)

你无法做你想做的事。

fedorqui的答案显示了如何从Python中读取环境变量,但这对您没有帮助。


首先,你只是启动shell脚本并立即假设它已经完成了它的工作,当它甚至可能还没有完成启动时。你可能会很幸运并且有时会工作,但不可靠。对于Popen对象,您需要wait(这也意味着您需要将其存储在变量中) - 或者更简单地说,call它(等待它完成)只是踢它。


你可能想检查返回值,或者只使用check_call,这样你就会知道它是否失败。


与此同时,如果你解决了这个问题,它仍然不会给你任何好处。 export不会将变量导出到您的父流程,而是将其导出到您的子级

如果要将值传递回父级,最简单的方法是将其写入stdout。然后,当然,您的Python代码必须读取您的输出。最简单的方法是使用check_output代替check_call


最后,我很确定您希望实际运行openssl并捕获其输出,而不仅仅是将output设置为文字字符串openssl x509 -in $userpem -noout -text。 (特别是没有单引号,这会阻止$userpem被替换,这意味着你一无所获。)要做到这一点,你需要使用反引号或$(),就像你之前做的那样线,而不是引号。


所以:

#!/bin/bash
userpem=$(egrep "CN=$1/" index.txt|awk '{print $3}').pem
output=$(openssl x509 -in $userpem -noout -text)
echo $output

def info(request, benutzername):
    os.chdir("/var/www/openvpn/examples/easy-rsa/2.0/keys")
    output = subprocess.check_output(["/var/www/openvpn/examples/easy-rsa/2.0/keys/getinfo.sh",benutzername])
    return HttpResponse(output)

作为旁注,os.chdir在Web服务器中通常是一个坏主意。这将为所有请求设置当前目录,而不仅仅是这个。 (如果您使用的是半先发制品的greenlet服务器框架,例如基于gevent的内容,则会特别糟糕,因为在您的chdir电话和您的chdir电话之间的其他位置可能subprocess {{1}}致电...)