我编写了一个脚本,可以使用一些数据库API。第一个API是用Python编写的,并且往往是脚本的大部分“工作”发生的地方。但是,其中一个数据库API是用Perl编写的,所以我编写了一个小的Perl脚本并用我的Python脚本调用它。这是我的思考过程:
1)我在Python脚本中保存了一组ID,我需要在Perl脚本中使用它们。我认为JSON是分享数据的最佳方式:
with open('IDS.json','w') as jsonfile:
json.dump(IB_IDS, jsonfile)
因此代码在我的数据库连接方法中,然后从主Python方法中调用。
2)接下来在主python方法中,我创建了一个CallPerlScript()
函数,我相信它会打开Perl脚本作为子进程运行:
path="/home/xxx/yyy"
pipe=subprocess.Popen(["perl","./GNOC.pl", path], stdin=subprocess.PIPE)
pipe.stdin.write(path)
pipe.stdin.close()
3)现在在Perl脚本中,我读了JSON文件:
my $idFile='IDS.json';
my $idJSON;
{
local $/;
open my $fh, '<', $idFile or die $!;
$idJSON = <$fh>;
close $fh;
}
4)然后我用Perl脚本中的数据做“填充”,最终得到一个我现在需要与我的Python脚本共享的电子邮件地址列表。我将此数据保存为Perl脚本中的新JSON文件:
open my $fh, ">", 'email_list.json';
print $fh encode_json(\@email_add);
close $fh
5)现在回到Python脚本中,我应该能够阅读这个刚刚更新的(这是关键的)电子邮件数据并用它来“做更多的事情”:
file='email_list.json'
input_data=json.loads(open(file).read())
这是我遇到问题的地方。每次我运行这个Python脚本时,当它读取这个JSON文件时(在步骤5中),它是从上次运行脚本时读取数据 。这显然是一个巨大的问题,因为我现在正在使用不正确的数据。
我真的不知道为什么会这样。我在这一点上最好的想法是,当Python子进程调用Perl脚本但后来继续并处理先前已经存储已经的email_list.json
文件。然后Perl脚本运行,但只在Python脚本终止后才保存新数据。
基本上,我需要在Python脚本终止之前与Python脚本共享Perl JSON数据。