繁体   English   中英

从bash脚本访问python字典

[英]accessing python dictionary from bash script

我正在从python脚本调用bash脚本。

我希望bash脚本在python脚本中向字典“ d”添加元素

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"]

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

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

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

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

由于这些脚本中的每个脚本都将在不同的进程中运行,因此它们无法访问彼此的数据(操作系统确保每个进程彼此独立,但特定的进程间通信方法除外)。

您需要做的是:使用某种进程间机制,以便初始python脚本从shell脚本获取数据。 例如,您可以使用https://docs.python.org/3/library/subprocess.html#subprocess.check_output从Shell标准输出中读取数据。

假设您有一个回显该值的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)

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

{'TEST': b'myarg 12'}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM