【问题标题】:Call exe from python script从python脚本调用exe
【发布时间】:2014-03-04 21:00:50
【问题描述】:

我正在尝试从文件夹中读取文件并运行与.py 文件位于同一目录中的colorDescriptor.exe。其实我想,每次它读取一个文件来计算colorDescriptor。

我的代码如下:

import os

from os import listdir
from os.path import isfile, join
mypath1 = "/clothes/"
mypath2 = "/i386-win-vc/"
onlyfiles = [ f for f in listdir(mypath1) if isfile(join(mypath1,f)) ]
image = mypath1+f
os.popen("colorDescriptor image --detector harrislaplace --descriptor sift --output 
onlyfiles.txt ")
print image

在终端,使用 colorDescriptor.exe 的语法例如:

colorDescriptor image.jpg --detector harrislaplace --descriptor sift --output onlyfiles.txt

我收到一个错误:

Tue04 10:53:30,248 - [Impala.Persistency.FileSystem ] Unable to find image in path 
Tue04 10:53:30,248 - [Impala.Core.Array.ReadFile ] Don't know how to read 
Tue04 10:53:30,248 - [Sandbox.koen.mainColorDescriptor ] [ERROR] Could not read input   
file: is it really a valid image? image

使用建议的代码进行更改后:

import os

from os import listdir
from os.path import isfile, join
mypath1 = "C:/Documents and Settings/Desktop/clothes/"
mypath2 = "C:/Documents and Settings/My  
Documents/colordescriptors40/i386-win-vc/"
onlyfiles = [ f for f in listdir(mypath1) if isfile(join(mypath1,f)) ]
image = mypath1+f
print  image
pattern = "colorDescriptor %s --detector harrislaplace --descriptor sift --output 
onlyfiles.txt" 
os.system(pattern % image)

我现在收到以下内容:

 Tue04 11:06:45,091 ERROR [Impala.Persistency.FileSystem ] Unable to find C:/Documents 
 in 
 path 
 Tue04 11:06:45,091 INFO  [Impala.Persistency.FileSystem ]     
 Tue04 11:06:45,091 ERROR [Impala.Core.Array.ReadFile ] Don't know how to read 
 Tue04 11:06:45,091 ERROR [Sandbox.koen.mainColorDescriptor ] [ERROR] Could not read input 

文件:它真的是一个有效的图像吗? C:/文件 【0.1s完成】

【问题讨论】:

  • 你有什么错误吗?
  • 不,onlyfiles 包含文件夹中的所有文件。从终端 colorDescriptor 的工作方式如下:koen.me/research/colordescriptors/readme
  • 请您详细说明您期望的输出?
  • 好吧,更清楚一点,似乎 os.popen 没有工作。它什么也没做。我期望的是,一个 txt 文件 onlyfiles.txt 将使用 image.jpg 的颜色描述创建,就像我运行批处理文件时一样。
  • 您需要帮助解决什么问题?如果你想在控制台上看到colorDescriptor 的输出,或者如果你想让python 在一个变量中接收它,参见popen 文档;或者更好的是,使用subprocess 模块。

标签: python exe


【解决方案1】:

问题是您没有使用您在命令中生成的值。您需要使用 glob.glob 来获取目录中的图像列表(可能是“*.jpg”),然后为每个文件创建一个新的 outfile.text 名称并执行类似以下命令:

    cmd = "colorDescriptor %s --detector harrislaplace --descriptor sift --output %s.txt " % (imagepath, imagepath)
    os.popen(cmd)

【讨论】:

  • 是的,你完全正确,这正是我打算做的,但我在使用 colorDescriptor 中读取的文件时遇到了问题。
【解决方案2】:

错误消息清楚地表明:您的示例代码在当前目录中的文件image 上运行colorDescriptor。但是,从代码上下文中,我们可以看到 image 是一个包含路径和真实文件名的变量。所以这样做:

pattern = "colorDescriptor %s --detector harrislaplace --descriptor sift --output onlyfiles.txt" 
os.popen(pattern % image)

编辑: 要在输出文件名中也使用相同的变量,最好的方法是切换到 python 的新命名语法。这是一个示例,它将所有输出文件放在您运行脚本的目录中,而不是与每个文件放在同一目录中(我相信如果它不是您想要的,您会看到如何更改它)。

pattern = "colorDescriptor {path}/{file} --output {file}.txt --detector harrislaplace --descriptor sift" 
os.popen( pattern.format(path=mypath1, file=f) )

我重新排列了参数的顺序以获得更好的可见性——我认为这没有区别。

【讨论】:

  • 我更改了代码,但是,我收到了同样的错误。
  • 如何对两个字符串使用这种语法,如下所示:fileOut = f+".txt" pattern = "colorDescriptor %s --detector harrislaplace --descriptor sift --output %s" os.system (pattern % image fileOut)
  • 多次使用一个值的最佳方法是使用新的python替换语法;查看我的更新答案。
猜你喜欢
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 2014-06-25
  • 2018-03-25
  • 1970-01-01
相关资源
最近更新 更多