c# 运行批处理文件以进行搅拌机导出的进程被暂停
Posted
技术标签:
【中文标题】c# 运行批处理文件以进行搅拌机导出的进程被暂停【英文标题】:c# process that running a batch file for blender exporting gets paused 【发布时间】:2017-12-20 12:04:26 【问题描述】:希望有人能帮我解决这个问题。
情况:
我需要将一个动画从搅拌机导出为一个序列,它必须在 c# 应用程序中触发。我正在使用带有 python 脚本的 blenders obj exporter,它与这个 blender wiki 中的示例几乎相同: https://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/Import-Export/Wavefront_OBJ
这是我写的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# 应用程序时,cmd 行是打开的,blender 开始执行,并且对于第一帧大约 250 帧中的 12 帧,一切正常,然后什么也没发生,应用程序仍在等待退出,但没有新的 obj文件已创建。
在我编写批处理文件之前,我尝试使用该 python 脚本直接作为一个进程运行搅拌机,但我遇到了同样的问题,它开始但在导出几帧后“暂停”/“停止”。
我猜这与我的 c# 进程代码有关(因为在 cmd shell 中运行确实有效)但我不知道我做错了什么。
【问题讨论】:
【参考方案1】:可能是您的搅拌机在此过程中冻结或 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()
这里的问题是你不能退出搅拌机(但是,或者我从来没有弄清楚),退出代码表明python脚本成功,因为即使使用 sys.exit(1) 搅拌机也会终止带有成功消息。
添加类似这样的内容,将您的错误消息写入您以后可以读取的文件(或者您的 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())
如果这对您进一步解开谜团有帮助,请告诉我
【讨论】:
以上是关于c# 运行批处理文件以进行搅拌机导出的进程被暂停的主要内容,如果未能解决你的问题,请参考以下文章