2016-10-01 61 views
-1

我有8個腳本。我希望把他們都到一個單一的腳本,問題是他們寫在不同的語言:腳本的組合:Python中的單個腳本中的Python,PHP,Ruby和Perl

  • PHP
  • 紅寶石
  • 的Perl
  • 的Python

但最後一個應該在Python中。

我想要做到這一點,而不需要用Python重寫所有這些。

有沒有辦法做到這一點?

腳本接受輸入.txt文件作爲命令行參數,並生成輸出.txt文件。

+0

你試過編寫一個shell腳本嗎? –

+0

我知道關於sh的一些信息,但我如何嘗試使用shell腳本? – robert

+0

這取決於。例如,在GNU/Linux平臺上,最好的shell之一是[Bash](https://www.gnu.org/software/bash/)。在最簡單的情況下,shell腳本看起來就像是一個命令列表。如果你想從Python腳本調用腳本,那麼你應該使用['subprocess'](https://docs.python.org/2/library/subprocess.html)。 –

回答

2

假設我們有一對夫婦每個腳本接受文件路徑作爲第一個參數:

的script.php

<?php 
$input_file = $argv[1] ?? 'default-input-file'; 
echo $input_file, PHP_EOL; 

script.pl

#!/usr/bin/perl 

use strict; 
use warnings; 

my $input_file = $ARGV[0] // 'default-input-file'; 
print "$input_file\n"; 

在Python可以通過subprocess.check_output來調用它們:

#/usr/bin/env python2 
import os.path 
import sys 
from subprocess import check_output, STDOUT, CalledProcessError 

if len(sys.argv) < 2: 
    sys.stderr.write("Usage: %s input-file" % sys.argv[0]) 
    sys.exit(1) 

input_file = sys.argv[1] 

if not os.path.isfile(input_file): 
    sys.stderr.write("%s is not a file" % input_file) 
    sys.exit(1) 

try: 
    output = check_output(['php', './script.php', input_file], stderr=STDOUT) 
    print "PHP: %s" % output 

    output = check_output(['perl', './script.pl', input_file], stderr=STDOUT) 
    print "Perl: %s" % output 
except CalledProcessError as e: 
    print >> sys.stderr, "Execution failed: ", e 

您可能想將命令封裝到shell腳本中。例如,Bash腳本可能如下所示:

#!/bin/bash - 

if ! php ./script.php "[email protected]" ; then 
    echo >&2 "php command failed" 
fi 

if ! perl ./script.pl "[email protected]" ; then 
    echo >&2 "perl command failed" 
fi 

[email protected]變量代表所有傳遞給腳本的命令行參數。 if語句檢查命令是否成功完成。 echo >&2命令向標準錯誤描述符打印一個字符串。有了shell封裝器,你可以在Python中調用一個子進程:

try: 
    output = check_output(['./call-scripts.sh', input_file]) 
    print output 
except CalledProcessError as e: 
    print >> sys.stderr, "Execution failed: ", e