我想问你们,如何将变量从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)
答案 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}}致电...)