前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从 PERL 脚本获取输出并将其加载到 MySQL 数据库的解决方案

从 PERL 脚本获取输出并将其加载到 MySQL 数据库的解决方案

原创
作者头像
用户11021319
发布2024-06-14 15:17:00
930
发布2024-06-14 15:17:00

1、问题背景

有一段 Python 脚本可以调用 Perl 脚本来解析文件,解析后,Perl 脚本会生成一个输出,这个输出将被加载到 Python 脚本中的 MySQL 数据库中。Python 脚本如下:

代码语言:javascript
复制
pipe = subprocess.Popen(["perl", "./parseGeneticCode.pl"], stdin=subprocess.PIPE)
pipe.stdin.close()
pipe = subprocess.Popen(["perl", "./makeTaxon.pl"], stdin=subprocess.PIPE)
pipe.stdin.close()

#Load taxon.out (output of makeTaxon.pl) in the database
sql10 = """LOAD DATA LOCAL INFILE 'gene_code.out' INTO TABLE geneticcode FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' (ncbi_taxon_ID, parent_ID, taxon_name, taxon_strain, rank, geneticcode_ID, mitochondrial_geneticcode_ID);"""
try:
  c.execute(sql10)
  conn.commit()
  print "\nDone uploading in taxon\n"
except StandardError, e:
  print e
  conn.rollback()
conn.close()

sql9 = """LOAD DATA LOCAL INFILE 'taxon.out' INTO TABLE taxon FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' (ncbi_taxon_ID, parent_ID, taxon_name, taxon_strain, rank, geneticcode_ID, mitochondrial_geneticcode_ID);"""
try:
  c.execute(sql9)
  conn.commit()
  print "\nDone uploading in taxon\n"
except StandardError, e:
  print e
  conn.rollback()
conn.close()

其中,文件 taxon.outgene_code.out 由 Perl 脚本创建。运行此 Python 脚本时会报错:

代码语言:javascript
复制
(2, "File 'taxon.out' not found (Errcode: 2)")
(0, '')
Traceback (most recent call last):
  File "common_data.py", line 247, in <module>
    conn.rollback()
_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away')

也就是说,文件 gene_code.outtaxon.out 都没有被上传到数据库中。

2、解决方案

在 Python 脚本中,使用 subprocess.Popen() 函数来调用 Perl 脚本时,需要在 Popen() 函数的 stdout= 参数中设置一个管道,以便将 Perl 脚本的输出重定向到该管道中。这样,就可以在 Python 脚本中读取 Perl 脚本的输出,并将其加载到 MySQL 数据库中。

修改后的 Python 脚本如下:

代码语言:javascript
复制
pipe = subprocess.Popen(["perl", "./parseGeneticCode.pl"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
pipe.stdin.close()
pipe_output = pipe.stdout.read()
#Load gene_code.out (output of parseGeneticCode.pl) in the database
sql10 = """LOAD DATA LOCAL INFILE 'gene_code.out' INTO TABLE geneticcode FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' (ncbi_taxon_ID, parent_ID, taxon_name, taxon_strain, rank, geneticcode_ID, mitochondrial_geneticcode_ID);"""
try:
  c.execute(sql10)
  conn.commit()
  print "\nDone uploading in taxon\n"
except StandardError, e:
  print e
  conn.rollback()
conn.close()

pipe = subprocess.Popen(["perl", "./makeTaxon.pl"], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
pipe.stdin.close()
pipe_output = pipe.stdout.read()
sql9 = """LOAD DATA LOCAL INFILE 'taxon.out' INTO TABLE taxon FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' (ncbi_taxon_ID, parent_ID, taxon_name, taxon_strain, rank, geneticcode_ID, mitochondrial_geneticcode_ID);"""
try:
  c.execute(sql9)
  conn.commit()
  print "\nDone uploading in taxon\n"
except StandardError, e:
  print e
  conn.rollback()
conn.close()

现在,运行此 Python 脚本,文件 gene_code.outtaxon.out 将被成功加载到 MySQL 数据库中。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、问题背景
  • 2、解决方案
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档