#python #blender
#python #blender
Вопрос:
Привет, я пытаюсь использовать несколько файлов python в моем скрипте Blender3D. (например. MyScript.py и MyModule.py ). MyScript.py выглядит как:
import bpy
import math
from add_utils import AddObjectHelper, add_object_data
import mathutils
# this line doesn't work
import MyModule
#### REGISTER ####
def register():
pass
def unregister():
print("Finished")
if __name__ == '__main__':
register()
Запустив скрипт в Blender3D, я получаю сообщение об ошибке:
"ImportError: No module named MyModule"
Я настроил папку «script» Blender3D, чтобы указать на папку, содержащую мой скрипт, и MyModule.py .
Спасибо за любую помощь.
J
Комментарии:
1. Если вы печатаете
sys.path
раньшеimport MyModule
, есть ли путь к вашему модулю в этом списке?2. хм, нет, это не так. Как бы мне рассказать Blender об этом пути?
Ответ №1:
Что-то должно добавить правильный путь к sys.path
переменной. Я не знаю его конкретно для Blender, но в целом вы могли бы добавить его следующим образом:
sys.path.append(r'.mymodule') # Relative path
sys.path.append(r'C:pathtomymodule') # Absolute path
Используемый зависит от условий, в которых вы работаете: если ваш скрипт находится в какой-либо (для Blender) выделенной папке скриптов, вы можете использовать первый. Если вы запускаете его (например) Program Files
из папки, используйте абсолютный путь.
Ответ №2:
Еще одна вещь, которая сработала для меня, — это запуск моего скрипта python со следующей командой терминала
/usr/local/bin/python2.7 path/to/script.py
Ответ №3:
Еще одно клише, которое я использую, когда у меня есть внешние модули, которые находятся в том же каталоге, что и файл .blend, это:
basedir =os.path.dirname(bpy.data.filepath)
if basedir not in sys.path:
sys.path.append(basedir)
import marchingCubes
# this next part forces a reload in case you edit the source after you first start the blender session
import imp
imp.reload(marchingCubes)
Я получил его из http://www.blender.org/documentation/blender_python_api_2_59_2/info_tips_and_tricks.html в котором на самом деле есть ошибка в том, что он используется os.path.basename
, когда вам действительно нужно os.path.dirname
.