2

我似乎在这里做了一些不正当的事情,我对它是什么感到目瞪口呆。我正在尝试从 Maya 中启动 The Foundry NUKE,当我尝试时,我收到与未找到模块有关的错误。但是,如果我在常规命令行上加载 Nuke,它会加载得非常好。似乎与 Maya 的 Python 解释器无法找到该模块有关?我好像找不到...

更新#1:我什至尝试在所有这些无济于事之前做一些 Nuke 插件、DLL、lib 和包含目录的 sys.path.appends...

更新#2:我重新安装了我的 Python 并验证它是 64 位的。还检查了我的 64 位 Maya 和 Nuke 版本。我也尝试了以下方法...在 Maya 之外打开一个普通的 Python 命令提示符,以通过 os.system 调用加载 Nuke,它可以工作。只有在 Maya 中执行 Nuke 的 os.system 调用时,它才会因导入此 _socket 模块的问题而失败。在检查 Maya 正在加载的 _socket 模块时,我得到:

import _socket
print _socket.__file__
C:\Program Files\Autodesk\Maya2016\Python\DLLs\_socket.pyd

让我相信 Maya 的 Python 正在加载这个 _socket 的差异版本,然后 Nuke 是什么,那里出了点问题。

原始代码/错误:

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_()
4

2 回答 2

2

我认为您可以使用内置的子进程来像这样调用 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)
于 2017-08-23T16:58:32.457 回答
0

您应该system在 Python 脚本中运行 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')

阅读:在安全模式下启动 NUKE 和 HIERO

如果它仍然不起作用,我认为这是您的 Python 库中的错误,或者是 init.py 内容中的问题。

于 2017-08-23T14:31:25.670 回答