在使用os.sytem()时检测python中的shell错误?

在使用os.sytem()时检测python中的shell错误?,python,shell,nlp,os.system,Python,Shell,Nlp,Os.system,我调用这个perl脚本,在这里输入文件,输出另一种格式的文件 但是,当perl脚本通过python的os.system()给出shell错误时,我如何捕获错误?当我从os.system()调用unix命令时,除了从shell捕获错误外,还有其他方法可以尝试吗 第二句话在os.system()处出现错误后会出现错误: 我试过: def rb_tokenize(text): os.system("echo '''"+text+"'''> tmp.in") noerror = os.sy

我调用这个perl脚本,在这里输入文件,输出另一种格式的文件

但是,当perl脚本通过python的
os.system()
给出shell错误时,我如何捕获错误?当我从
os.system()
调用unix命令时,除了从shell捕获错误外,还有其他方法可以尝试吗

第二句话在
os.system()
处出现错误后会出现错误:

我试过:

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)
但是
noerror==0
尽管它给出了
sh:1:语法错误:未终止的引号字符串
错误

经过一些尝试,我意识到以下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."""
调用
os.system(“您的命令”)
将返回unix状态代码

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

编辑:os.system有点陈旧过时,建议您改用子流程模块。请参见

bash在使用Germen现成编码时表现不佳。试试像这样的东西

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 

您可以捕获os.system的返回值。它指示命令是否成功执行(在Unix中返回0)。它是否返回
int(0)
str(0)
。我尝试检查了这两个选项,但没有捕获到sh错误。在关于os.system()的阅读中,似乎需要将其与os.wait结合起来,因为os.system是在子shell中执行的。(主执行线程不等待它的完成吗?)我可以建议以不同的方式解决您的问题吗?我确信perl的东西所做的任何事情都可以在Python中单独完成。也许你想告诉我们最终要达到的目标是什么。那么,看在上帝的份上,请至少使用体面的Python将这些东西写入临时文件:
以open('tmp.in','w')作为tmpfile:
tmpfile.write(text)
我已经尝试过了,但没有成功。unix命令返回一个
0
以及
语法错误
Opps,my bad,与其他内容混淆。我已经修改了答案。更新后的代码仍然不起作用;P
pid,code=os.system(“您的命令”)
返回
TypeError:“int”对象不可编辑
对不起,我想的是os.wait()。如果您手动运行命令,然后运行echo$,那么让我们尝试使用此更改tact?然后,你得到了什么?有趣的是,我甚至不能重复句子2。实际上你可以重复三个引号。但您和alfe使用python而不是echo编写文件是正确的。发生此错误是因为编码问题。
code = os.system("your command")
if code == 0:
    print "Success! :)"
else:
    print "Fail! :("
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