2015-04-02 256 views
1

有一個襯墊python腳本:從另一個python腳本在Windows上運行Python腳本7

# inner.py 
print "hello" 

當我創建另一個腳本:

import os 
os.system('python inner.py > out.txt') 

,並在命令行中執行它,一切正常如預期的那樣,「你好」是寫在out.txt

當我用以下代替os.system參數:

os.system('inner.py > out.txt') 

並執行腳本,我得到以下錯誤:

close failed in file object destructor: 
Error in sys.excepthook: 

Original exception was: 

如果我不重定向輸出,因此我得到「你好」在這兩種情況下控制檯。

我在Windows 7 64位。

爲什麼我得到一個錯誤?如果要重定向文件使用subprocess.check_call的輸出和標準輸出重定向到文件對象

execfile('inner.py') # in the outer script 
+0

如果你打開一個命令窗口,你可以在沒有指定python的情況下運行python腳本嗎?即'C:> runme.py'的作品? (更具體地說'runme.py> somefile.txt'工作? – 2015-04-02 15:38:02

+4

99.99%的時間,你不應該使用'system'來執行其他的python腳本,你應該使用'import'。 – Kevin 2015-04-02 15:40:07

+0

正如Joran Beasley所問,是你確定你試圖用os.system()運行的命令確實有效,如果你嘗試從shell執行確切的命令,它是否按照你想要的那樣進行操作?正如凱文指出的那樣,可能還有其他方法可以完成這個任務這是更pythonic – 2015-04-02 15:49:17

回答

0

使用execfile函數,而不是對於您的打印示例,除非將sys.stdout重定向到文件對象,但如果實際上具有將某些內容返回給另一個模塊的函數,則可以導入它們,然後將輸出寫入文件而不使用子進程。

+0

Thx。事實上,我現實生活中的問題看起來像os.system(「cmda.py | cmdb.exe」)而cmdb並沒有從stdin中得到任何東西。在這種情況下,execfile不起作用os.system應該工作。 – 2015-04-05 09:47:57

0

from subprocess import check_call 

with open("out.txt",'w') as f: 
    check_call(["python", "/path/to/inner.py"], stdout=f) 

它不會工作

+0

Thx。我可以做這個工作,但os.system對我來說更簡單,更自然,所以我想知道爲什麼它不起作用。 – 2015-04-05 09:50:26

相關問題