如何从 Maya 中启动 Nuke?
How can I launch Nuke from within Maya?
我这里好像做的不对,看得我傻眼了。我试图从 Maya 中启动 The Foundry NUKE,当我尝试时,我收到与未找到模块相关的错误。但是,如果我在常规命令行上加载 Nuke,它会加载得很好。似乎与 Maya 的 Python 解释器相关的东西找不到这个模块?我好像找不到它...
更新 #1:我什至尝试过 sys.path.appends 一些 Nuke 插件、DLL、lib,并在所有这些都无济于事之前包含目录...
更新 #2:我重新安装了我的 Python 并确认它是 64 位的。还检查了我的 64 位 Maya 和 Nuke 版本。我也尝试了以下操作...在 Maya 外部打开一个正常的 Python 命令提示符以通过 os.system 调用加载 Nuke 并且它有效。仅当在 Maya 中执行 os.system 调用 Nuke 时,它才会因导入此 _socket 模块出现问题而失败。在检查 Maya 正在加载的 _socket 模块时,我得到:
import _socket
print _socket.__file__
C:\Program Files\Autodesk\Maya2016\Python\DLLs\_socket.pyd
让我相信 Maya 的 Python 正在加载此 _socket 的差异版本,然后是 Nuke 是什么,那里出了点问题。
原文Code/Errors:
C:\Program Files\Nuke9.0v8\Nuke9.0.exe
Traceback (most recent call last):
File "C:/Program Files/Nuke9.0v8/plugins/init.py", line 22, in <module>
import nukescripts.ViewerProcess
File "C:/Program Files/Nuke9.0v8/plugins\nukescripts\__init__.py", line 22, in <module>
from nukeprofiler import *
File "C:/Program Files/Nuke9.0v8/plugins\nukescripts\nukeprofiler.py", line 2, in <module>
import socket
File "C:\Python27\lib\socket.py", line 47, in <module>
import _socket
ImportError: DLL load failed: The specified module could not be found.
C:/Program Files/Nuke9.0v8/plugins/init.py : error interpreting this plugin
from PySide import QtCore, QtGui
import maya.cmds as cmds
import os, sys
#import subprocess
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(314, 216)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth())
Dialog.setSizePolicy(sizePolicy)
self.blastBtn = QtGui.QPushButton(Dialog)
self.blastBtn.setGeometry(QtCore.QRect(110, 130, 75, 23))
self.blastBtn.setObjectName("blastBtn")
self.blastBtn.clicked.connect(self.RunPlayblast)
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Playblast & Nuke Me", None, QtGui.QApplication.UnicodeUTF8))
self.blastBtn.setText(QtGui.QApplication.translate("Dialog", "Blast", None, QtGui.QApplication.UnicodeUTF8))
def RunPlayblast(self):
cmds.playblast(fmt="qt", f="myMovie.mov", fo=True)
self.RunNuke()
def RunNuke(self):
nukeExe = r'C:\Program Files\Nuke9.0v8\Nuke9.0.exe'
myTemplate = r'B:\home\nukePBTemplate.nk'
os.system('"'+nukeExe+'" -x ' +myTemplate)
#command = nukeExe+" -x "+myTemplate
#subprocess.Popen(command)
if __name__ == '__main__':
app = QtGui.QApplication.instance()
Dialog = QtGui.QDialog()
blastMe = Ui_Dialog()
blastMe.setupUi(Dialog)
Dialog.show()
app.exec_()
您应该在 Python 脚本中 运行 system
MEL 命令。为此,您需要使用带有字符串参数(字符串内字符串)的 mel.eval
方法。 eval
命令的目的是为用户提供一种方法来执行只能在 运行 时间确定的 MEL 命令或程序。
import maya.mel as mel
def RunNuke(self):
mel.eval('system "/Applications/Nuke10.5v5/Nuke10.5v5.app/Contents/MacOS/Nuke10.5v5 --nc --nukex"')
我正在 运行在 macOS(不是 Windows)上使用 NUKEX 的非商业版本并且它可以工作。
您的代码的完整版本应如下所示:
from PySide import QtCore, QtGui
import maya.cmds as cmds
import os, sys
import maya.mel as mel
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(314, 216)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth( Dialog.sizePolicy().hasHeightForWidth() )
Dialog.setSizePolicy(sizePolicy)
self.blastBtn = QtGui.QPushButton(Dialog)
self.blastBtn.setGeometry(QtCore.QRect(110, 130, 75, 23))
self.blastBtn.setObjectName("blastBtn")
self.blastBtn.clicked.connect(self.RunPlayblast)
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Playblast & Nuke Me", None, QtGui.QApplication.UnicodeUTF8))
self.blastBtn.setText(QtGui.QApplication.translate("Dialog", "Blast", None, QtGui.QApplication.UnicodeUTF8))
def RunPlayblast(self):
cmds.playblast(fmt="qt", f="myMovie.mov", fo=True)
self.RunNuke()
def RunNuke(self):
mel.eval('system "/Applications/Nuke10.5v5/Nuke10.5v5.app/Contents/MacOS/Nuke10.5v5 --nc --nukex "')
if __name__ == '__main__':
app = QtGui.QApplication.instance()
Dialog = QtGui.QDialog()
blastMe = Ui_Dialog()
blastMe.setupUi(Dialog)
Dialog.show()
app.exec_()
如果您仍然遇到从 Maya 中启动 NUKE 的问题,请尝试 运行 在 safe mode
:
import maya.mel as mel
def RunNuke(self):
mel.eval('system "C:\Program Files\Nuke9.0v8\Nuke9.0.exe" --safe --nc --nukex')
Read it: Launching NUKE and HIERO in safe mode.
如果它仍然不起作用,我认为这是您的 Python 库中的一个错误,或者是 init.py.
的内容中的一个问题
我认为你可以像这样使用内置子进程来调用 nuke
import subprocess
nukeProcess = subprocess.Popen(["C:/Program Files/Nuke9.0v8/Nuke9.0.exe", "-x", "B:/home/nukePBTemplate.nk"])
而且我认为你从不使用 mel.eval("system /whatever"),因为你从 python 开始尝试,python 已经有许多内置方法来处理系统命令,如子流程、命令等 ..
更新
import subprocess, os
newEnv = os.environ.copy()
newEnv["PYTHONPATH"] = newEnv["PATH"] + "/local/share/python/2.7/libs"
nukeProcess = subprocess.Popen(["C:/Program Files/Nuke9.0v8/Nke9.0.exe", "-x", "B:/home/nukePBTemplate.nk"], env=newEnv)
我这里好像做的不对,看得我傻眼了。我试图从 Maya 中启动 The Foundry NUKE,当我尝试时,我收到与未找到模块相关的错误。但是,如果我在常规命令行上加载 Nuke,它会加载得很好。似乎与 Maya 的 Python 解释器相关的东西找不到这个模块?我好像找不到它...
更新 #1:我什至尝试过 sys.path.appends 一些 Nuke 插件、DLL、lib,并在所有这些都无济于事之前包含目录...
更新 #2:我重新安装了我的 Python 并确认它是 64 位的。还检查了我的 64 位 Maya 和 Nuke 版本。我也尝试了以下操作...在 Maya 外部打开一个正常的 Python 命令提示符以通过 os.system 调用加载 Nuke 并且它有效。仅当在 Maya 中执行 os.system 调用 Nuke 时,它才会因导入此 _socket 模块出现问题而失败。在检查 Maya 正在加载的 _socket 模块时,我得到:
import _socket
print _socket.__file__
C:\Program Files\Autodesk\Maya2016\Python\DLLs\_socket.pyd
让我相信 Maya 的 Python 正在加载此 _socket 的差异版本,然后是 Nuke 是什么,那里出了点问题。
原文Code/Errors:
C:\Program Files\Nuke9.0v8\Nuke9.0.exe
Traceback (most recent call last):
File "C:/Program Files/Nuke9.0v8/plugins/init.py", line 22, in <module>
import nukescripts.ViewerProcess
File "C:/Program Files/Nuke9.0v8/plugins\nukescripts\__init__.py", line 22, in <module>
from nukeprofiler import *
File "C:/Program Files/Nuke9.0v8/plugins\nukescripts\nukeprofiler.py", line 2, in <module>
import socket
File "C:\Python27\lib\socket.py", line 47, in <module>
import _socket
ImportError: DLL load failed: The specified module could not be found.
C:/Program Files/Nuke9.0v8/plugins/init.py : error interpreting this plugin
from PySide import QtCore, QtGui
import maya.cmds as cmds
import os, sys
#import subprocess
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(314, 216)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth())
Dialog.setSizePolicy(sizePolicy)
self.blastBtn = QtGui.QPushButton(Dialog)
self.blastBtn.setGeometry(QtCore.QRect(110, 130, 75, 23))
self.blastBtn.setObjectName("blastBtn")
self.blastBtn.clicked.connect(self.RunPlayblast)
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Playblast & Nuke Me", None, QtGui.QApplication.UnicodeUTF8))
self.blastBtn.setText(QtGui.QApplication.translate("Dialog", "Blast", None, QtGui.QApplication.UnicodeUTF8))
def RunPlayblast(self):
cmds.playblast(fmt="qt", f="myMovie.mov", fo=True)
self.RunNuke()
def RunNuke(self):
nukeExe = r'C:\Program Files\Nuke9.0v8\Nuke9.0.exe'
myTemplate = r'B:\home\nukePBTemplate.nk'
os.system('"'+nukeExe+'" -x ' +myTemplate)
#command = nukeExe+" -x "+myTemplate
#subprocess.Popen(command)
if __name__ == '__main__':
app = QtGui.QApplication.instance()
Dialog = QtGui.QDialog()
blastMe = Ui_Dialog()
blastMe.setupUi(Dialog)
Dialog.show()
app.exec_()
您应该在 Python 脚本中 运行 system
MEL 命令。为此,您需要使用带有字符串参数(字符串内字符串)的 mel.eval
方法。 eval
命令的目的是为用户提供一种方法来执行只能在 运行 时间确定的 MEL 命令或程序。
import maya.mel as mel
def RunNuke(self):
mel.eval('system "/Applications/Nuke10.5v5/Nuke10.5v5.app/Contents/MacOS/Nuke10.5v5 --nc --nukex"')
我正在 运行在 macOS(不是 Windows)上使用 NUKEX 的非商业版本并且它可以工作。
您的代码的完整版本应如下所示:
from PySide import QtCore, QtGui
import maya.cmds as cmds
import os, sys
import maya.mel as mel
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(314, 216)
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth( Dialog.sizePolicy().hasHeightForWidth() )
Dialog.setSizePolicy(sizePolicy)
self.blastBtn = QtGui.QPushButton(Dialog)
self.blastBtn.setGeometry(QtCore.QRect(110, 130, 75, 23))
self.blastBtn.setObjectName("blastBtn")
self.blastBtn.clicked.connect(self.RunPlayblast)
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Playblast & Nuke Me", None, QtGui.QApplication.UnicodeUTF8))
self.blastBtn.setText(QtGui.QApplication.translate("Dialog", "Blast", None, QtGui.QApplication.UnicodeUTF8))
def RunPlayblast(self):
cmds.playblast(fmt="qt", f="myMovie.mov", fo=True)
self.RunNuke()
def RunNuke(self):
mel.eval('system "/Applications/Nuke10.5v5/Nuke10.5v5.app/Contents/MacOS/Nuke10.5v5 --nc --nukex "')
if __name__ == '__main__':
app = QtGui.QApplication.instance()
Dialog = QtGui.QDialog()
blastMe = Ui_Dialog()
blastMe.setupUi(Dialog)
Dialog.show()
app.exec_()
如果您仍然遇到从 Maya 中启动 NUKE 的问题,请尝试 运行 在 safe mode
:
import maya.mel as mel
def RunNuke(self):
mel.eval('system "C:\Program Files\Nuke9.0v8\Nuke9.0.exe" --safe --nc --nukex')
Read it: Launching NUKE and HIERO in safe mode.
如果它仍然不起作用,我认为这是您的 Python 库中的一个错误,或者是 init.py.
的内容中的一个问题我认为你可以像这样使用内置子进程来调用 nuke
import subprocess
nukeProcess = subprocess.Popen(["C:/Program Files/Nuke9.0v8/Nuke9.0.exe", "-x", "B:/home/nukePBTemplate.nk"])
而且我认为你从不使用 mel.eval("system /whatever"),因为你从 python 开始尝试,python 已经有许多内置方法来处理系统命令,如子流程、命令等 ..
更新
import subprocess, os
newEnv = os.environ.copy()
newEnv["PYTHONPATH"] = newEnv["PATH"] + "/local/share/python/2.7/libs"
nukeProcess = subprocess.Popen(["C:/Program Files/Nuke9.0v8/Nke9.0.exe", "-x", "B:/home/nukePBTemplate.nk"], env=newEnv)