c#进程运行批处理文件以进行混合器导出暂停

时间:2017-07-15 14:00:05

标签: c# batch-file export blender

我希望有人可以帮我解决这个问题。

情况:

我需要从blender导出一个动画作为一个序列,它必须在c#app内部跳转。我正在使用带有python脚本的blenders obj exporter,它与这个blender wiki中的示例非常相似: http://example.com/hi-user/?1234

这是我写的python脚本:

import bpy
import sys

argv = sys.argv
argv = argv[argv.index("--") + 1:] # get all args after "--"

obj_out = argv[0]

bpy.ops.export_scene.obj(filepath=obj_out, axis_forward='-Z', axis_up='Y', use_animation=1, keep_vertex_order=1, use_normals=1, use_materials=0)

除了我写了以下批处理文件:

"C:\Program Files\Blender Foundation\Blender\blender.exe" "C:\Users\holgk\Documents\Some Folders\Test.blend" --background --python "C:\Program Files\Blender Foundation\Blender\convert_blend_to_obj.py" -- "C:\Users\holgk\Documents\Some Folders\Test.obj"

我的c#代码如下所示:

using System;
using System.Diagnostics;

namespace BlenderToObjs
{
    class Program
    {
        static void Main(string[] args)
        {
            ProcessStartInfo processInfo;
            Process process;

            processInfo = new ProcessStartInfo("cmd.exe", "/c \"" + @"C:\blender_export_to_obj.bat" + "\"");
            processInfo.CreateNoWindow = false;
            processInfo.UseShellExecute = false;

            processInfo.RedirectStandardError = true;
            processInfo.RedirectStandardOutput = true;

            process = Process.Start(processInfo);
            process.WaitForExit();
        }
    }
}

当我使用窗口cmd shell时,一切正常。对于每个帧,都会创建一个obj文件。但当我使用我的c#app cmd行打开时,blender开始执行,对于第一帧约250个中的一个,一切正常,然后没有任何反应,应用程序仍在等待退出但没有新的obj文件已创建。

在我编写批处理文件之前,我试图直接使用该python脚本运行blender作为一个进程,我开始时遇到了同样的问题但在导出几帧后“暂停”/“停止”。

我猜它与我的c#进程代码有关(因为在cmd shell中运行确实有效)但我不知道我做错了什么。

1 个答案:

答案 0 :(得分:0)

可能是你的搅拌机在这个过程中冻结了,或者obj导出失败了吗?

好像你没有抓住错误,搅拌机永远不会被终止,所以它一直在继续。

首先,你应该将你的python代码包装成try,块除外:

import bpy
import sys

def main():
    try:
        # Do stuff
        argv = sys.argv
        argv = argv[argv.index("--") + 1:] # get all args after "--"

        obj_out = argv[0]

        bpy.ops.export_scene.obj(filepath=obj_out, axis_forward='-Z', axis_up='Y', use_animation=1, keep_vertex_order=1, use_normals=1, use_materials=0)
        O.wm.quit_blender()

    except:
        # you could write your error file here

        # exit blender
        sys.exit(1)
        O.wm.quit_blender()
main()

这里的问题是你不能退出blender(或者我从来没有想过它),退出代码表明python脚本是成功的,因为即使使用sys.exit(1)blender也是如此将以成功消息终止。

添加类似的内容,将错误消息写入以后可以读取的文件(或者您的c#代码可以读取)

        log.error('Failed to bake light map textures', exc_info=True)
        if 'ERROR_FILE' in os.environ:
            with open(os.environ['ERROR_FILE'], 'w') as file:
                file.write(traceback.format_exc())

让我知道这是否有助于你进一步解决这个谜团