在Python中调用外部命令

时间:2015-04-21 09:21:57

标签: python

我有一个XML文件,我从ftp中恢复过来。我想将此xml转换为json 我使用xml2json

如何在Python脚本中调用外部命令?

python脚本:

#!/usr/bin/env python

import ftplib
import os

# Connection information
server = 'xxxxxx.xxxx'
username = 'xxxxxxxx'
password = 'xxxxxxxx'

# Directory and matching information
directory = '/datas/'
filematch = '*.xml'
src='/opt/scripts/'
dst='/opt/data/'

# Establish the connection
ftp = ftplib.FTP(server)
ftp.login(username, password)

# Change to the proper directory
ftp.cwd(directory)

# Loop through matching files and download each one individually
for filename in ftp.nlst(filematch):
    fhandle = open(filename, 'wb')
    print 'Getting ' + filename
    ftp.retrbinary('RETR ' + filename, fhandle.write)
    fhandle.close()

#?????????????????? EXECUTE XML2JSON TO CONVERT MY XML INTO JSON ???????????????????????
#?????????????????? xml2json -t xml2json -o stockvo.json stockvo.xml --strip_text ?????????????

#move the stockvo.xml file to destination
os.system('mv %s %s' % (src+'stockvo.xml', dst+'stockvo.xml'))

#remove the src file 
os.unlink(src+'stockvo.xml')

3 个答案:

答案 0 :(得分:3)

subprocess module具有此功能。

您可以执行以下操作:

 import subprocess

 subprocess.call('xml2json -t xml2json -o stockvo.json stockvo.xml --strip_text', shell=True)

请注意,使用shell=True选项可能存在安全隐患,但这取决于您将对脚本执行的操作以及潜在用户是否可以尝试对其执行shell injection

修改:正如@PadraicCunningham建议的那样,实际上不需要使用shell=True,因为您没有使用shell实用程序作为通配符或{{1}为家庭扩张。所以它应该只能起作用:

~

答案 1 :(得分:0)

import subprocess

 subprocess.call(['xml2json', '-t', 'xml2json', '-o', 'stockvo.json', 'stockvo.xml', '--strip_text'])

答案 2 :(得分:0)

使用subprocess模块:

  

subprocess.check_call(args,*,stdin = None,stdout = None,stderr = None,   壳=假)'   使用参数运行命令。等待命令完成。   如果返回码为零,则返回,否则加注   CalledProcessErrorCalledProcessError对象将返回   返回码属性中的代码。

import subprocess

try:
    subprocess.check_call(['xml2json', '-t', 'xml2json', '-o', 'stockvo.json', 'stockvo.xml' '--strip_text'])
except subprocess.CalledProcessError:
    pass  # handle failure here