-1

我从http://www.linguistics.ruhr-uni-bochum.de/~dipper/software/tokenize.perl调用这个 perl 脚本,在给定输入文件的情况下,它会以另一种格式输出文件。

但是当 perl 脚本通过 python 给出一个 shell 错误时os.system(),我怎样才能捕捉到错误呢?当我从 shell 调用 unix 命令时,有没有办法尝试从 shell 捕获错误os.system()

def rb_tokenize(text):
  os.system("echo '''"+text+"'''> tmp.in")
  os.system("perl rbtokenize.pl tmp.in tmp.out")
  return " ".join([i.strip() for i in codecs.open("tmp.out","r","utf8").readlines()])

sentence1 = """Ich bin schwanger."""

sentence2 = """Herr Präsident! Ich freue mich, in der Aussprache über diesen Bericht das Wort zu ergreifen und Frau Theato zu beglückwünschen. Ich halte dies für einen Bericht, bei dem die Zusammenarbeit zwischen den Ausschüssen sehr gut funktioniert hat, und das Ergebnis, das uns heute vorliegt, ist ein nüchterner, sachlicher Bericht auf einem besonders delikaten Gebiet. Nüchternheit und Sachlichkeit, die folglich bei der Entwicklung des Artikels 280.4 besonders notwendig sind. Denn wenn wir einen Preis für den Artikel vergeben müßten, der am schwersten verständlich, am wenigsten eindeutig, am unklarsten ist - wie Sie es auch bezeichnen wollen -, dann gäbe es sicher einen harten Wettstreit, weil der Vertrag eine Musterkollektion von komplizierten Artikeln ist, aber dieser ist ohne Zweifel einer der aussichtsreichsten Anwärter auf diesen Preis. Gleichzeitig ist es eine besonders delikate Frage, weil sie den Schutz der finanziellen Interessen der Gemeinschaft betrifft, wie Frau Theato sehr richtig gesagt hat. Wir sind uns alle der Notwendigkeit bewußt - und dieses Parlament hat diese Sorge aufgeworfen bzw. ist ein großer Vorkämpfer in dieser Sache gewesen -, die finanziellen Interessen der Gemeinschaft zu schützen. Aber Vorsicht, wie die Franzosen sagen, "ne jettons pas le bébé avec l'eau du bain ", man darf das Kind nicht mit dem Bade ausschütten, das heißt, beim Schutz der finanziellen Interessen der Gemeinschaft sind einerseits - und Frau Theato hat es gesagt - die Zuständigkeiten der Nationalstaaten zu respektieren, aber auch andere Dinge, die die Bürger angehen, die die wesentlichen Garantien betreffen. Durch die Schlußfolgerungen des Berichts Theato werden sie uneingeschränkt bewahrt. Deshalb hoffe ich in meiner Eigenschaft als Vorsitzende des Ausschusses für Recht und Binnenmarkt und selbstverständlich auch in meiner Eigenschaft als Abgeordnete, daß dieses Parlament morgen mit einer breiten Mehrheit den Bericht unterstützt und daß er durch die Kommission eine gute Umsetzung erfährt."""

# This gives a correct string output.
rb_tokenize(sentence1) 

# Wrong output
# The perl script gives an error and the new tmp.out 
# isn't updated and it gives the output from sentence1
rb_tokenize(sentence2)

第二句将在以下错误处出现错误os.ystem()

sh: 1: Syntax error: Unterminated quoted string

我试过了:

def rb_tokenize(text):
  os.system("echo '''"+text+"'''> tmp.in")
  noerror = os.system("perl rbtokenize.pl tmp.in tmp.out")
  print noerror
  return " ".join([i.strip() for i in codecs.open("tmp.out","r","utf8").readlines()])

rb_tokenize(sentence2)

noerrror == 0尽管它给出了sh: 1: Syntax error: Unterminated quoted string错误。

经过一些尝试,我意识到以下 echo 命令甚至在 unix 终端上都不起作用:

echo """Herr Präsident! Ich freue mich, in der Aussprache über diesen Bericht das Wort zu ergreifen und Frau Theato zu beglückwünschen. Ich halte dies für einen Bericht, bei dem die Zusammenarbeit zwischen den Ausschüssen sehr gut funktioniert hat, und das Ergebnis, das uns heute vorliegt, ist ein nüchterner, sachlicher Bericht auf einem besonders delikaten Gebiet. Nüchternheit und Sachlichkeit, die folglich bei der Entwicklung des Artikels 280.4 besonders notwendig sind. Denn wenn wir einen Preis für den Artikel vergeben müßten, der am schwersten verständlich, am wenigsten eindeutig, am unklarsten ist - wie Sie es auch bezeichnen wollen -, dann gäbe es sicher einen harten Wettstreit, weil der Vertrag eine Musterkollektion von komplizierten Artikeln ist, aber dieser ist ohne Zweifel einer der aussichtsreichsten Anwärter auf diesen Preis. Gleichzeitig ist es eine besonders delikate Frage, weil sie den Schutz der finanziellen Interessen der Gemeinschaft betrifft, wie Frau Theato sehr richtig gesagt hat. Wir sind uns alle der Notwendigkeit bewußt - und dieses Parlament hat diese Sorge aufgeworfen bzw. ist ein großer Vorkämpfer in dieser Sache gewesen -, die finanziellen Interessen der Gemeinschaft zu schützen. Aber Vorsicht, wie die Franzosen sagen, "ne jettons pas le bébé avec l'eau du bain ", man darf das Kind nicht mit dem Bade ausschütten, das heißt, beim Schutz der finanziellen Interessen der Gemeinschaft sind einerseits - und Frau Theato hat es gesagt - die Zuständigkeiten der Nationalstaaten zu respektieren, aber auch andere Dinge, die die Bürger angehen, die die wesentlichen Garantien betreffen. Durch die Schlußfolgerungen des Berichts Theato werden sie uneingeschränkt bewahrt. Deshalb hoffe ich in meiner Eigenschaft als Vorsitzende des Ausschusses für Recht und Binnenmarkt und selbstverständlich auch in meiner Eigenschaft als Abgeordnete, daß dieses Parlament morgen mit einer breiten Mehrheit den Bericht unterstützt und daß er durch die Kommission eine gute Umsetzung erfährt."""
4

2 回答 2

2

调用os.system("your command")返回一个 Unix 状态码。

code = os.system("your command")
if code == 0:
    print "Success! :)"
else:
    print "Fail! :("

编辑: os.system 有点旧且过时,建议您改用 subprocess 模块。请参阅http://docs.python.org/2/library/subprocess.html#module-subprocess

于 2013-11-06T14:17:33.973 回答
1

bash 不能很好地与开箱即用的德语编码配合使用。尝试类似的东西

fil = open('path/to/file.txt','w')
fil.write(text)
fil.close()
code = os.system("perl rbtokenize.pl path/to/file.txt tmp.out")
if code == 0:
    return ... #Success

# Failed
raise SomethingSensible 
于 2013-11-06T14:41:32.527 回答