我希望有人可以帮我解决这个问题。
情况:
我需要从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中运行确实有效)但我不知道我做错了什么。
答案 0 :(得分:0)
首先,你应该将你的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())
让我知道这是否有助于你进一步解决这个谜团