从另一个python脚本在Windows上运行Python脚本7

问题描述:

有一个衬垫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

使用execfile函数,而不是对于您的打印示例,除非将sys.stdout重定向到文件对象,但如果实际上具有将某些内容返回给另一个模块的函数,则可以导入它们,然后将输出写入文件而不使用子进程。

+0

Thx。事实上,我现实生活中的问题看起来像os.system(“cmda.py | cmdb.exe”)而cmdb并没有从stdin中得到任何东西。在这种情况下,execfile不起作用os.system应该工作。 – 2015-04-05 09:47:57

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