标签: nuke

如何写入Python子进程'stdin?

我正在尝试编写一个启动子进程的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 stdin subprocess nuke

55
推荐指数
3
解决办法
8万
查看次数

我可以使用别名从python脚本执行程序

我几乎是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 unix bash alias nuke

10
推荐指数
2
解决办法
1万
查看次数

如何取消Nuke中的执行写入节点(Python)

我一直在用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 multithreading render nodes nuke

5
推荐指数
1
解决办法
1186
查看次数

提取代码以在回调中对其进行本地化

这是我在这里发表的第一篇文章,如果我做错了,请告诉我.我试着找一个现有的答案,但不知道该搜索什么.

考虑以下简单示例,一个名为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)

python nuke

5
推荐指数
1
解决办法
86
查看次数

Nuke Viewer设置framerange麻烦

我正在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)

我认为问题在于,在脚本完成运行之前,查看器中的数据不会更新。

如何强制核对刷新查看器?

还是可能有一条命令正在等待完成以前命令的更新?

还是有必要在查看器中指定帧范围?

python api viewer nuke

2
推荐指数
1
解决办法
668
查看次数

标签 统计

nuke ×5

python ×5

alias ×1

api ×1

bash ×1

multithreading ×1

nodes ×1

render ×1

stdin ×1

subprocess ×1

unix ×1

viewer ×1