0

我正在编写一个 Python (2.5) 脚本,它将搜索文件夹,获取特定文件,然后将文件和命令传递给 Windows 中的 CMD shell。这需要使用命令来完成program.exe /rptcsv <file being created> <file being used>。此外,.exe 必须从 C:\Program Files (x86)\Reporter 文件夹执行,因此工作目录会发生变化。

这是我的问题:我需要 Python 搜索一个特定文件(fnmatch),然后将整个命令传递给 shell。正确完成此操作后,该进程将在后台运行,而无需启动 GUI。
我看过关于标准输入的帖子。stdout 等,我不需要任何回传——我只需要 Python 来传递整个过程。现在发生的情况是 Python 启动了 GUI,但未能通过带有变量的命令。有没有办法做到这一点?
我仍然是 Python n00b,所以请原谅任何明显的错误。

MC01 = 'WKST01*.bat'
MC02 = 'WKST02*.bat'
files = os.listdir(FOLDER)

MC01_CMD = fnmatch.filter(files, MC01)
MC01_CSV = "MC01.csv"

exe = ("reporter.exe /rptcsv", MC01_CSV, MC01_CMD)
os.chdir("C:\Program Files (x86)\Reporter")
os.system("exe")

编辑:在我的代码前面,我在文件夹中使用了 os.walk:

print "Walking directory..."
    for root, dirs, files in os.walk(FOLDER):
        for file in files:
            pathname = os.path.join(root, file)

因为我切换了工作目录,它正在 C:\Program Files (x86)\Reporter 中搜索 MC01_CMD 文件,并且(当然)它不存在。有没有办法在不创建新变量的情况下加入路径名和 MC01_CMD,这样它就有了 MC01_CMD 的正确位置?

4

2 回答 2

0

os.system将单个字符串作为命令。在你的情况下,那是 string "exe"。您需要连接由返回的文件名fnmatch.filter,使用" ".join(exe)然后调用os.system(command)。请注意os.system(command).

要在树中查找文件,只需将调用的(您的绝对路径)基本文件夹os.walk与 basedir 和文件名连接起来。您也可以在 期间过滤文件名os.walk

MC01 = 'WKST01*.bat'
MC02 = 'WKST02*.bat'

def collect_files(folder, pattern):
    for basedir, dirs, files in os.walk(folder):
        for file in fnmatch.filter(files, pattern):
                yield os.path.join(folder, basedir, file)


MC01_CMD = collect_files(FOLDER, MC01)
MC01_CSV = "MC01.csv"

command = "reporter.exe /rptcsv "+ MC01_CSV + " " + " ".join(MC01_CMD)
os.chdir("C:\Program Files (x86)\Reporter")
os.system(command)
于 2013-05-30T13:11:54.680 回答
0

变量不会在字符串文字中展开。所以os.system("exe")与输入execmd 并按 enter 相同。

所以我对正确代码的猜测是:

MC01_CSV = MC01 + ".csv"

os.chdir("C:\Program Files (x86)\Reporter")
os.system("reporter.exe /rptcsv " + MC01_CSV + " " + MC01_CMD)
于 2013-05-30T13:23:45.083 回答