After Effects:如何启动外部进程并将其分离
After Effects: How to launch an external process and detach it
我有一个 After Effects Scripting 问题,但我不确定它是否会通过 AE 知识得到解决,也许更多的是通过独立开发。
我想从 After Effects 启动一个外部进程,实际上我想使用 After Effects 提供的 aerender.exe 启动打开的 AEP 文件的渲染,同时保持它可用。
var projectFile = app.project.file;
var aeRender = "C:\Program Files\Adobe\Adobe After Effects CC 2018\Support Files\aerender.exe";
var myCommand = "-project" + " " + projectFile.fsName;
system.callSystem("cmd /c \""+aeRender+"\"" + " " + myCommand);
所以我写了这个简单的 JSX 代码并且它工作了,它正确地渲染了场景渲染队列。
但是 After Effects 正在冻结,它等待过程结束。
我希望它一直可用。
所以我尝试编写一个 .cmd 文件并使用 AE system.callSystem 启动它,但我遇到了同样的问题,
我试图通过一个 .exe 文件(使用 pyInstaller 从一个简单的 python 编译而来),同样的问题:
import sys
import subprocess
arg = sys.argv
pythonadress = arg[0]
aeRender = arg[1]
projectFileFSname = arg[2]
myCommand = "-project" + " " +projectFileFSname
callSystem = "cmd /c \""+aeRender +"\"" + " " + myCommand
subprocess.run(callSystem)
我什至尝试过 "cmd /c start ",但似乎更糟,因为 After Effects 在该过程完成后继续冻结。
有没有办法让 AE 相信该过程已完成,而实际上并未完成?
非常感谢任何帮助!
system.callSystem()
将冻结脚本的执行,因此您可以动态创建一个 .bat 文件并 运行 使用 .execute()
.
这是一个示例 .js:
var path = {
"join": function ()
{
if (arguments.length === 0) return null;
var args = [];
for (var i = 0, iLen = arguments.length; i < iLen; i++)
{
args.push(arguments[i]);
}
return args.join(String($.os.toLowerCase().indexOf('win') > -1 ? '\' : '/'));
}
};
if (app.project.file !== null && app.project.renderQueue.numItems > 0)
{
var
// aeRenderPath = path.join(new File($._ADBE_LIBS_CORE.getHostAppPathViaBridgeTalk()).parent.fsName, 'aerender.exe'), // works only in CC 2018 and earlier
aeRenderPath = path.join(new File(BridgeTalk.getAppPath(BridgeTalk.appName)).parent.fsName, 'aerender.exe'),
batFile = new File(path.join(new File($.fileName).parent.fsName, 'render.bat')),
batFileContent = [
'"' + aeRenderPath + '"',
"-project",
'"' + app.project.file.fsName + '"'
];
batFile.open('w', undefined, undefined);
batFile.encoding = 'UTF-8';
batFile.lineFeed = 'Unix';
batFile.write(batFileContent.join(' '));
batFile.close();
// system.callSystem('explorer ' + batFile.fsName);
batFile.execute();
$.sleep(1000); // Delay the script so that the .bat file can be executed before it's being deleted
batFile.remove();
}
当然,您可以进一步开发它并使其 OSX 兼容,为其添加更多功能等,但这是主要思想。
这是一个包含所有 aerender 选项的列表(如果您还不知道它们的话):https://helpx.adobe.com/after-effects/using/automated-rendering-network-rendering.html
顺便说一句,$._ADBE_LIBS_CORE.getHostAppPathViaBridgeTalk()
将为您提供 "AfterFX.exe" 文件路径,因此您可以通过这种方式更轻松地获得 "aerender.exe" 路径。
编辑:$._ADBE_LIBS_CORE
已在 CC2019 中删除,因此您可以直接使用 BridgeTalk
而不是 CC 2019 及更高版本。
我有一个 After Effects Scripting 问题,但我不确定它是否会通过 AE 知识得到解决,也许更多的是通过独立开发。
我想从 After Effects 启动一个外部进程,实际上我想使用 After Effects 提供的 aerender.exe 启动打开的 AEP 文件的渲染,同时保持它可用。
var projectFile = app.project.file;
var aeRender = "C:\Program Files\Adobe\Adobe After Effects CC 2018\Support Files\aerender.exe";
var myCommand = "-project" + " " + projectFile.fsName;
system.callSystem("cmd /c \""+aeRender+"\"" + " " + myCommand);
所以我写了这个简单的 JSX 代码并且它工作了,它正确地渲染了场景渲染队列。 但是 After Effects 正在冻结,它等待过程结束。 我希望它一直可用。
所以我尝试编写一个 .cmd 文件并使用 AE system.callSystem 启动它,但我遇到了同样的问题, 我试图通过一个 .exe 文件(使用 pyInstaller 从一个简单的 python 编译而来),同样的问题:
import sys
import subprocess
arg = sys.argv
pythonadress = arg[0]
aeRender = arg[1]
projectFileFSname = arg[2]
myCommand = "-project" + " " +projectFileFSname
callSystem = "cmd /c \""+aeRender +"\"" + " " + myCommand
subprocess.run(callSystem)
我什至尝试过 "cmd /c start ",但似乎更糟,因为 After Effects 在该过程完成后继续冻结。
有没有办法让 AE 相信该过程已完成,而实际上并未完成?
非常感谢任何帮助!
system.callSystem()
将冻结脚本的执行,因此您可以动态创建一个 .bat 文件并 运行 使用 .execute()
.
这是一个示例 .js:
var path = {
"join": function ()
{
if (arguments.length === 0) return null;
var args = [];
for (var i = 0, iLen = arguments.length; i < iLen; i++)
{
args.push(arguments[i]);
}
return args.join(String($.os.toLowerCase().indexOf('win') > -1 ? '\' : '/'));
}
};
if (app.project.file !== null && app.project.renderQueue.numItems > 0)
{
var
// aeRenderPath = path.join(new File($._ADBE_LIBS_CORE.getHostAppPathViaBridgeTalk()).parent.fsName, 'aerender.exe'), // works only in CC 2018 and earlier
aeRenderPath = path.join(new File(BridgeTalk.getAppPath(BridgeTalk.appName)).parent.fsName, 'aerender.exe'),
batFile = new File(path.join(new File($.fileName).parent.fsName, 'render.bat')),
batFileContent = [
'"' + aeRenderPath + '"',
"-project",
'"' + app.project.file.fsName + '"'
];
batFile.open('w', undefined, undefined);
batFile.encoding = 'UTF-8';
batFile.lineFeed = 'Unix';
batFile.write(batFileContent.join(' '));
batFile.close();
// system.callSystem('explorer ' + batFile.fsName);
batFile.execute();
$.sleep(1000); // Delay the script so that the .bat file can be executed before it's being deleted
batFile.remove();
}
当然,您可以进一步开发它并使其 OSX 兼容,为其添加更多功能等,但这是主要思想。
这是一个包含所有 aerender 选项的列表(如果您还不知道它们的话):https://helpx.adobe.com/after-effects/using/automated-rendering-network-rendering.html
顺便说一句,$._ADBE_LIBS_CORE.getHostAppPathViaBridgeTalk()
将为您提供 "AfterFX.exe" 文件路径,因此您可以通过这种方式更轻松地获得 "aerender.exe" 路径。
编辑:$._ADBE_LIBS_CORE
已在 CC2019 中删除,因此您可以直接使用 BridgeTalk
而不是 CC 2019 及更高版本。