需要一个脚本来迭代文件并执行命令

时间:2015-03-20 12:40:20

标签: python networking iteration rendering

请耐心等待我,之前我没有使用过python,而且我试图尽快完成一些渲染,然后停下来跟踪它。

我将.ifd文件输出到网络驱动器(Z :),它们存储在文件夹结构中;

Z:  
 - \0001 
 - \0002 
 - \0003

我需要遍历单个文件夹中的ifd文件,但文件数量不是静态的,因此还需要有一个可定义的范围(1-300,1-2500等)。因此,脚本必须能够为开始和结束范围增加两个参数。

在每次迭代中,它都会执行一个叫做“咒语”的东西。使用这个陈述;

mantra -f file.FRAMENUMBER.ifd outputFile.FRAMENUMBER.png

我在互联网上发现了一个应该做类似事情的脚本;

import sys, os

#import command line args
args = sys.argv

# get args as string
szEndRange = args.pop()
szStartRange = args.pop()

#convert args to int
nStartRange = int(szStartRange, 10);
nEndRange = int(szEndRange, 10);
nOrd = len(szStartRange);

#generate ID range
arVals = range(nStartRange, nEndRange+1);


for nID in arVals:
   szFormat = 'mantra -V a -f testDebris.%%(id)0%(nOrd)dd.ifd' % {"nOrd": nOrd};
   line = szFormat % {"id": nID};
   os.system(line);

我遇到的问题是我无法让它发挥作用。它似乎在迭代,并做了一些事情 - 但看起来它只是在某个地方吐出一个不同的文件夹。

TLDR;

我需要一个至少需要两个参数的脚本;

  • startFrame将
  • endFrame

并从那些创建 frameRange ,然后用于迭代执行以下命令的所有ifd文件;

  • mantra -f fileName.currentframe.ifd fileName.currentFrame.png

如果我能够指定文件名,文件目录和输出目录也很棒。我已尝试手动执行此操作,但必须有一些惯例我不知道,因为当我尝试(在结肠处停止)时它会出现错误。

如果有人可以把我挂起来或指出我正确的方向,那就是膨胀。我知道我应该尝试学习python,但是我的智慧会以渲染结束并需要帮助。

3 个答案:

答案 0 :(得分:3)

import os, subprocess, sys

if len(sys.argv) != 3:
    print('Must have 2 arguments!')
    print('Correct usage is "python answer.py input_dir output_dir" ')
    exit()

input_dir = sys.argv[1]
output_dir = sys.argv[2]
input_file_extension = '.txt'
cmd = 'currentframe'

# iterate over the contents of the directory
for f in os.listdir(input_dir):
    # index of last period in string
    fi = f.rfind('.')
    # separate filename from extension
    file_name = f[:fi]
    file_ext = f[fi:]
    # create args
    input_str = '%s.%s.ifd' % (os.path.join(input_dir, file_name), cmd)
    output_str =  '%s.%s.png' % (os.path.join(output_dir + file_name), cmd)
    cli_args = ['mantra', '-f', input_str, output_str]
    #call function
    if subprocess.call(cli_args, shell=True):
        print('An error has occurred with command "%s"' % ' '.join(cli_args))

这应该足以让您使用当前或稍作修改。

答案 1 :(得分:1)

您可以这样做,而不是专门输入开始和结束范围:

import os

path, dirs, files = os.walk("/Your/Path/Here").next()
nEndRange = len(files)

#generate ID range    
arVals = range(1, nEndRange+1);

命令os.walk()计算您指定的文件夹中的文件数。

虽然,获得所需输出的更简单方法是这样的:

import os
for filename in os.listdir('dirname'):
    szFormat = 'mantra -f ' + filename + ' outputFile.FRAMENUMBER.png'
    line = szFormat % {"id": filename}; # you might need to play around with this formatting
    os.system(line);

因为os.listdir()遍历指定的目录而filename是该目录中的每个文件,所以您甚至不需要计算它们。

答案 2 :(得分:0)

帮助构建命令。

for nID in arVals:
   command = 'mantra -V a -f '
   infile = '{0}.{1:04d}.ifd '.format(filename, id)
   outfile = '{0}.{1:04d}.png '.format(filename, id)              
   os.system(command + infile + outfile);

并且肯定使用os.walkos.listdir,例如@logic推荐

for file in os.listdir("Z:"):
   filebase = os.path.splitext(file)[0]
   command = 'mantra -V a -f {0}.ifd {0}.png'.format(filebase)