2015-04-21 5 views
2

У меня есть файл XML, я восстановился из ftp. Я хочу преобразовать этот xml в json i использовать 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') 
+1

Вы можете использовать 'функцию subprocess.call' из' subprocess' модуля. – cnluzon

+0

Вы пробовали сценарий оболочки? –

+0

@ Тиходрома нет, как я могу попробовать это, пожалуйста? – Mercer

ответ

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 на самом деле, так как вы не используете утилиты оболочки в качестве маски или ~ для домашнего расширения. Поэтому он должен работать только как:

subprocess.call('xml2json -t xml2json -o stockvo.json stockvo.xml --strip_text') 
+1

Нет смысла использовать shell = True, вы также должны использовать check_call –

+0

@PadraicCunningham, вы правы, вы также можете использовать 'check_call', и это правда, что' shell = True' в этом случае не требуется. – cnluzon

0
import subprocess 

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

Использование subprocess модуля:

subprocess.check_call (арг, *, STDIN = None, стандартный вывод = None, STDERR = None, оболочки = False) ' Запустить команду с аргументами. Дождитесь завершения команды. Если код возврата был равен нулю, тогда возвращайте, в противном случае повысите CalledProcessError. Объект CalledProcessError будет иметь код возврата в атрибуте returncode.

import subprocess 

try: 
    subprocess.check_call(['xml2json', '-t', 'xml2json', '-o', 'stockvo.json', 'stockvo.xml' '--strip_text']) 
except subprocess.CalledProcessError: 
    pass # handle failure here 
Смежные вопросы