运行 来自 python 代码的可执行文件

Running an executable from python code

我正在尝试 运行 使用 colordescriptor.exe 从图像数据库创建密码本。该代码带有一个 python scirpt,它实际上是一个用于创建密码本的 scirpt。在使用示例中,它说我必须 运行 以下命令来控制:python exampleCreateCodebook.py trainimages.txt outputFilename,其中 trainimages.txt 数据集图像列表和 outputFilename 输出密码本的名称。当我尝试 运行 命令时(从 .exe 所在的目录)我收到以下错误:

Traceback (most recent call last):
File "exampleCreateCodebook.py", line 112, in <module>
sys.exit(main())
File "exampleCreateCodebook.py", line 109, in main
return process(options, args)
File "exampleCreateCodebook.py", line 80, in process
raise Exception("Error when executing '%s': command returned error" % cmdLine)
Exception: Error when executing 'colorDescriptor.exe C:\sift\fashion1[=12=]010big.jpg --keepLimited 30 --outputFormat binary --output c:\users\user\appdata\local\temp\tmp9qzldd --detector densesampling --ds_spacing 6 --ds_scales 1.2 --descriptor opponentsift': command returned error

我怎样才能运行 正确地使用 exampleCreateCodebook?由于 os.system 功能,我是否有可能遇到问题?脚本文件是following。我注意到我的程序在第 80 行失败,因为 returnCode 等于 -1。因此,os.system(cmdLine) 似乎没有 运行 正确。我试图用 returnCode =subprocess.call(['cmd', '/k', cmdLine] ) 更改上面的命令。当我这样做时,scirpt 仅在 for 循环内迭代一次,并在 subprocess.call 之后停止。子进程是否负责停止 for 循环?

for inputImage in inputImages:
    cmdLine = "%s %s --keepLimited %d --outputFormat binary --output %s %s" % (binarySoftware, inputImage, keepLimited, tempFilename, extractionConfig)
    print cmdLine
    subprocess.call(['cmd', '/k', cmdLine] )
    print 'ole'

列表 inputImages 包含 1000 张图像。但是 for 循环在第一次迭代后停止,在第一次调用子进程时。

您显示的输出是否正确?看起来不像是逐字复制的。

查看example Python code,不可能在第80行引发异常并且要执行第82行。

如果奇迹般地执行第 82 行,如果 colorDescriptor.exe 生成的输出文件长度小于 4 个字节,IOError: [Errno 22] Invalid argument 就会发生。当 colorDescriptor.exe 像您的 运行 期间那样失败时,很可能就是这种情况。 DescriptorIO.py 的第 84-85 行:

identify = f.read(4)
f.seek(-4, os.SEEK_CUR)

看起来像是一个假设文件至少有 4 个字节的错误。如果没有,seek() 将失败 IOError

您需要找出 colorDescriptor.exe 失败的原因。尝试手动 运行 运行程序,您可能会发现问题的根源:

colorDescriptor.exe C:\sift\fashion1[=11=]010big.jpg --keepLimited 30 --outputFormat binary --output    c:\users\user\appdata\local\temp\tmpywsquy --detector densesampling --ds_spacing 6 --ds_scales 1.2 --descriptor opponentsift

N.B。我更改了上面的命令,删除了 -- keepLimited 中的空格,因为那是代码应该生成的内容。如果它真的在命令中生成空格,那可能就是问题所在。