从bash脚本访问python字典

时间:2016-08-08 11:09:01

标签: python bash

我从python脚本调用bash脚本。

我希望bash脚本将一个元素添加到字典" d"在python脚本

abc3.sh

#!/bin/bash
rank=1
echo "plugin"
function reg()
{
    if [ "$1" == "what" ]; then
        python -c 'from framework import data;data(rank)'
        echo "iamin"
    else
        plugin
    fi
}

plugin()
{
    echo "i am plugin one"
}

reg $1

python文件:

 import sys,os,subprocess
    from collections import *
    subprocess.call(["./abc3.sh what"],shell=True,executable='/bin/bash')

    def data(rank,check):
       d[rank]["CHECK"]=check
    print d[1]["CHECK"]

2 个答案:

答案 0 :(得分:2)

如果我理解正确,你有一个运行shell脚本的python脚本,而脚本又运行一个新的python脚本。并且您希望第二个Python脚本在第一个脚本中更新字典。这不会那样。

运行第一个python脚本时,它将创建一个新的python进程,它将解释源脚本中的每条指令。

当它到达指令subprocess.call(["./abc3.sh what"],shell=True,executable='/bin/bash')时,它将产生一个新的shell(bash)进程,该进程将反过来解释你的shell脚本。

当shell脚本到达python -c <commands>时,它会调用一个新的python进程。此过程与初始python进程无关(即使您运行相同的脚本文件)。

因为每个脚本都将在不同的进程中运行,所以它们无法访问彼此的数据(操作系统会确保每个进程彼此独立,除了特定的进程间通信方法)。 / p>

您需要做什么:使用某种进程间机制,以便初始python脚本从shell脚本获取数据。例如,您可以使用https://docs.python.org/3/library/subprocess.html#subprocess.check_output

从shell标准输出中读取数据

答案 1 :(得分:0)

假设你有一个shell插件回显值:

echo $1 12

模型python脚本看起来像(我在Windows / MSYS2 BTW上,因此是Linux用户的奇怪路径):

import subprocess

p = subprocess.Popen(args=[r'C:\msys64\usr\bin\sh.exe',"-c","C:/users/jotd/myplugin.sh myarg"],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
o,e= p.communicate()
p.wait()
if len(e):
    print("Warning: error found: "+e.decode())

result = o.strip()
d=dict()
d["TEST"] = result
print(d)

它打印字典,证明参数已传递给shell,然后返回处理。 请注意,stderr已被过滤掉以避免与结果混淆,但如果发生则会打印到控制台。

{'TEST': b'myarg 12'}