0

我想问你们如何将变量从 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)
4

2 回答 2

1

你不能做你想做的事。

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


首先,您刚刚启动 shell 脚本并立即假设它已经完成了工作,而它甚至可能还没有完成启动。您可能会很幸运,有时可以让它工作,但并不可靠。你需要waitPopen对象(这也意味着你需要将它存储在一个变量中)——或者,更简单地说,call它(它一直等到它完成)而不是仅仅启动它。


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


同时,如果你解决了这个问题,它仍然对你没有任何好处。export不会将变量导出到您的父进程,而是将它们导出到您的子进程

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


最后,我很确定您想要实际运行openssl并捕获它的输出,而不仅仅是设置output为文字 string 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通话之间的其他地方......)

于 2013-11-14T12:06:04.997 回答
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
于 2013-11-14T11:30:33.043 回答