我正在尝试编写一个启动子进程的Python脚本,并写入子进程stdin.我还希望能够确定子进程崩溃时要采取的操作.
我正在尝试启动的过程是一个程序nuke,它有自己的内置版本的Python,我希望能够提交命令,然后告诉它在执行命令后退出.到目前为止,我已经知道,如果我在命令提示符上启动Python,然后nuke作为子进程启动,那么我可以输入命令nuke,但我希望能够将所有这些都放在一个脚本中,以便主Python程序可以启动nuke然后写入其标准输入(因此也可以写入其内置版本的Python),并告诉它做一些时髦的东西,所以我编写了一个脚本,nuke如下所示:
subprocess.call(["C:/Program Files/Nuke6.3v5/Nuke6.3", "-t", "E:/NukeTest/test.nk"])
Run Code Online (Sandbox Code Playgroud)
然后没有任何事情发生,因为nuke等待用户输入.我现在如何写入标准输入?
我这样做是因为我正在运行一个插件nuke,导致它在渲染多个帧时间歇性地崩溃.所以我希望这个脚本能够启动nuke,告诉它做某事然后如果它崩溃了,再试一次.因此,如果有办法赶上崩溃并且仍然可以,那就太棒了.
我几乎是python脚本的新手,所以请原谅任何愚蠢的问题,但任何人都可以给予的任何帮助将非常感激.
我正在尝试编写一个python脚本供其他人使用,在其中我需要调用一个我不会总是知道路径的程序.为了解决这个问题,我要求用户提供程序的路径,这将有效,但我不希望用户每次运行脚本时都必须提供路径,所以我一直在尝试设置bash通过将脚本添加到〜/ .profile和〜/ .bashrc文件来实现别名.
然后我可以使用别名从交互式bash shell运行程序,但是当脚本尝试运行它时,我收到"找不到命令"错误...
我已经尝试重新获取.bashrc文件并使用"shopt -s expand_aliases"命令而没有运气.
我的〜/ .bashrc看起来像这样:
alias nuke='/Applications/Nuke6.2v4/Nuke6.2v4.app/Contents/MacOS/Nuke6.2v4'
Run Code Online (Sandbox Code Playgroud)
这段脚本看起来像这样:
os.system('source .bashrc')
os.system('shopt -s expand_aliases')
os.system('nuke -x scriptPath')
Run Code Online (Sandbox Code Playgroud)
但是一旦脚本达到这一点,它就会返回:
sh: nuke: command not found
Run Code Online (Sandbox Code Playgroud)
我做错了什么或者是否有另外一种方法可以永久存储程序的路径?
我一直在用Python写一个Nuke渲染管理器并遇到了一个问题:
nuke.cancel()似乎没有正常工作.我的python脚本创建一个主类并连接到服务器(用Java编写),然后进入无限循环,每次都获得一个新任务(以JSON对象的形式).它获得的每个循环打开一个脚本?找到写节点并执行它们.要将进度报告回服务器,我已经添加了回调:
nuke.addBeforeFrameRender(lambda: self._pre_frame_render())
以及
nuke.addAfterFrameRender(lambda: self._post_frame_render())
在哪里
def _pre_frame_render(self):
self._host_socket.send(struct.pack('>b', 1))
self._host_socket.send(struct.pack('>i', nuke.frame()))
def _post_frame_render(self):
self._host_socket.send(struct.pack('>b', 2))
self._host_socket.send(struct.pack('>i', nuke.frame()))
Run Code Online (Sandbox Code Playgroud)
要cancel在服务器上启用方法,我有一个单独的线程在渲染处于活动状态时运行并等待"取消"请求
class CancelHandler(threading.Thread):
def __init__(self, input_socket, cancel_callback):
threading.Thread.__init__(self)
self.cancel_set = threading.Event()
self.run_set = threading.Event()
self._input_socket = input_socket
self._cancel_callback = cancel_callback
def run(self):
while True:
if self.run_set.is_set():
msg_raw = recv_msg(self._input_socket)
msg = json.loads(msg_raw)
if 'mode' in msg and msg['mode'] == 'cancel':
print msg_raw
self.cancel_set.set()
self.run_set.clear()
self._cancel_callback()
Run Code Online (Sandbox Code Playgroud)
在cancel_callback被定义为
def _cancel_callback(self):
nuke.cancel()
self._is_canceled = True
Run Code Online (Sandbox Code Playgroud)
在循环开始之前,我启动CancelHandler线程,并在每次迭代时 …
这是我在这里发表的第一篇文章,如果我做错了,请告诉我.我试着找一个现有的答案,但不知道该搜索什么.
考虑以下简单示例,一个名为python的模块mymath.py,它只使用内置的python操作和模块.这个自定义模块是可移植的,因此任何人都可以执行代码而无需安装除了stock python以外的任何东西
# mymath.py
import sys
def minus(a, b):
return a-b
def mult(a, b):
return a*b
def div(a, b):
return a/b
def plus(a, b):
return a+b
def sum_series(int_list):
sum = 0
for i in int_list:
sum = plus(sum, i)
return sum
def main():
my_list = [2, 4, 6]
value = sum_series(my_list)
sys.stdout.write("your list total = {}".format(value))
Run Code Online (Sandbox Code Playgroud)
请注意,main()只有拨打sum_series()电话的电话plus().在这个虚构的代码库中可能需要其他功能,但我们只关心main().
现在,我想将相关的源代码复制到另一个对象作为文本字符串.换句话说,收集main()它和它的所有依赖项(递归地),产生一串可执行代码.
我目前的解决方案
import inspect
import mymath
# copy the source …Run Code Online (Sandbox Code Playgroud) 我正在Nuke10中编写时间轴同步脚本。我应该更改全局框架设置。例:
nuke.root().knob('first_frame').setValue(1)
nuke.root().knob('last_frame').setValue(100)
Run Code Online (Sandbox Code Playgroud)
之后,我应该更改查看器的播放范围。例:
vv = nuke.activeViewer().node()
vv['frame_range_lock'].setValue(True)
vv['frame_range'].setValue('5-40')
Run Code Online (Sandbox Code Playgroud)
另外,它起作用了。但是在一起-不是。开始时,我的全局帧范围是1-10。当我运行所有这些行时-帧范围设置为1-100,但是播放范围设置为5-10。
我在脚本中间添加命令以检查播放范围:
nuke.root().knob('first_frame').setValue(1)
nuke.root().knob('last_frame').setValue(100)
x = vv.playbackRange()
print(x)
vv['frame_range_lock'].setValue(True)
vv['frame_range'].setValue('5-40')
Run Code Online (Sandbox Code Playgroud)
它是打印的:
# Result: 1-10
Run Code Online (Sandbox Code Playgroud)
我认为问题在于,在脚本完成运行之前,查看器中的数据不会更新。
如何强制核对刷新查看器?
还是可能有一条命令正在等待完成以前命令的更新?
还是有必要在查看器中指定帧范围?