我从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
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"]
答案 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'}