用python打开

时间:2011-11-22 20:59:04

标签: python popen

令我感到困惑。

我有一个python脚本,可以在Windows平台上运行,生成XML文件,下载一些图像,然后调用外部控制台应用程序,使用xml和python脚本生成的图像生成视频。

我用pOPen调用的应用程序应该返回一个状态,即[success]或[invalid]或[fail],这取决于它如何解释我传递的数据。

如果我使用我的生成脚本生成信息,然后在另一个脚本中单独调用控制台应用程序,它工作正常,我会成功并生成视频。

成功的代码(请忽略测试打印!):

print ("running console app...")

cmd = '"C:/Program Files/PropertyVideos/propertyvideos.console.exe" -xml data/feed2820712.xml -mpeg -q normal'
print (cmd)
p = subprocess.Popen(cmd , stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output = p.communicate()[0]
print ("\n----\n[" + output + "]\n----\n")

if output == "[success]":
    print "\nHURRAHHHHH!!!!!!!"

print ("finished...")

但是如果我在生成信息的脚本末尾包含相同的代码来提供控制台应用程序,那么它运行大约2秒并输出= []

相同的代码,只是在另一个脚本的末尾运行...

编辑: 感谢Dave,Dgrant和ThomasK,似乎生成脚本没有关闭文件,因为将strerr重定向到stdout显示:

Unhandled Exception: System.IO.IOException: The process cannot access the file '
C:\videos\data\feed2820712.xml' because it is being used by another process.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, I
nt32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions o
ptions, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)

但是我关闭了文件: 从生成脚本中提取:

    xmlfileObj.write('</FeedSettings>\n') # write the last line
    xmlfileObj.close

    # sleep to allow files to close
    time.sleep(10)

    # NOW GENERATE THE VIDEO
    print ("initialising video...")

    cmd = '"C:/Program Files/PropertyVideos/propertyvideos.console.exe" -xml data/feed2820712.xml -mpeg -q normal'
    print (cmd)
    p = subprocess.Popen(cmd , stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    output = p.communicate()[0]
    print ("\n----\n[" + output + "]\n----\n")

    if output == "[success]":
        print "\nHURRAHHHHH!!!!!!!"

    print ("finished...")   

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:4)

您没有关闭该文件。你的代码说:

xmlfileObj.close

什么时候应该

xmlfileObj.close()

编辑:只是为了澄清 - 代码xmlfileObj.close是一个有效的python表达式,它返回对文件(或类似文件)的内置close方法的引用宾语。因为它是一个有效的python表达式,所以它是完全合法的代码,但它没有任何副作用。具体来说,它没有实际调用close()方法的效果。您需要包含开括号和近括号来执行此操作。