bpy 在全球范围内工作,但在 flask 应用程序中不工作
bpy works in global scope but not in flask app
我一直在使用 javascript 并且最近开始 python 使用 blender-python 库。(bpy) 所以这个问题可能是我的一些误解,因为缺少语言行为知识。
这个函数使用bpy。我进行了测试,它成功地将 .gltf 文件转换为 .fbx。
import os
import bpy
path = os.getcwd()
UPLOAD_FOLDER = os.path.join(path, 'uploads')
DOWNLOAD_FOLDER = os.path.join(path, 'downloads')
def gltf_to_fbx(filename):
path = os.path.join(UPLOAD_FOLDER, filename)
bpy.ops.import_scene.gltf(filepath = path)
portion = os.path.splitext(filename)
newname = portion[0] + ".fbx"
path_to_file = os.path.join(DOWNLOAD_FOLDER, newname)
bpy.ops.export_scene.fbx(filepath = path_to_file)
bpy.ops.object.delete()
gltf_to_fbx("1.gltf")
但是,当我像这样在 flask app router 中 运行 它时,它会抛出一个错误
from flask import Flask, flash, request
app = Flask(__name__)
@app.route('/', methods=['POST'])
def upload_file():
file = request.files['model']
filename = secure_filename(file.filename)
save_path = os.path.join(UPLOAD_FOLDER, filename)
file.save(save_path)
gltf_to_fbx(filename)
flash('File successfully uploaded')
return "Success"
if __name__ == "__main__":
app.run(host="localhost", port = 5000)
这是错误信息
...
File "index.py", line 62, in upload_file
gltf_to_fbx("1_1.gltf")
File "index.py", line 32, in gltf_to_fbx
bpy.ops.import_scene.gltf(filepath = path)
File "C:\ProgramData\Blender Foundation\Blender.82\scripts\modules\bpy\ops.py", line 201, in __call__
ret = op_call(self.idname_py(), None, kw)
RuntimeError: Error: Traceback (most recent call last):
File "C:\ProgramData\Blender Foundation\Blender.82\scripts\addons\io_scene_gltf2\__init__.py", line 850, in
execute
return self.import_gltf2(context)
File "C:\ProgramData\Blender Foundation\Blender.82\scripts\addons\io_scene_gltf2\__init__.py", line 869, in
import_gltf2
return self.unit_import(self.filepath, import_settings)
File "C:\ProgramData\Blender Foundation\Blender.82\scripts\addons\io_scene_gltf2\__init__.py", line 887, in
unit_import
BlenderGlTF.create(self.gltf_importer)
File "C:\ProgramData\Blender Foundation\Blender.82\scripts\addons\io_scene_gltf2\blender\imp\gltf2_blender_gltf.py", line 41, in create
BlenderScene.create(gltf, scene_idx)
File "C:\ProgramData\Blender Foundation\Blender.82\scripts\addons\io_scene_gltf2\blender\imp\gltf2_blender_scene.py", line 53, in create
bpy.context.window.scene = bpy.data.scenes[gltf.blender_scene]
AttributeError: 'NoneType' object has no attribute 'scene'
location: C:\ProgramData\Blender Foundation\Blender.82\scripts\modules\bpy\ops.py:201
错误消息似乎是说它无法导入文件,因为它...错误?但这没有意义,因为它在 运行 在 Flask 应用程序之外时没有抛出错误。
我想也许文件在 bpy 尝试加载它之前没有保存,但没有。我还尝试了 运行 将 gltf_to_fbx
函数与已保存的文件路径结合使用,它仍然会抛出相同的错误。 我能想到的唯一原因是 bpy 在全局范围内工作,但在 flask 应用程序中不工作。这对我来说听起来很奇怪。
欢迎任何意见。谢谢!
编辑
我刚刚注释掉了 bpy 模块中的错误行。然后它又抛出一个错误,我也把它注释掉了。现在可以了!不过,我对这种解决方案并不感到自豪。我的假设是 bpy 仅设计为 运行 在 Blender 控制台上。所以 import_scene.gltf
函数假设系统有 运行ning Blender 上下文,在这种情况下它没有。(仍然存在问题;它是如何 运行 在全局范围内没有错误的?)我发现这个文档解释了如何在 Blender 之外构建一个看起来很有希望的模块。 https://wiki.blender.org/wiki/Building_Blender/Windows
在 gltf_to_fbx
函数行 path = os.path.join(UPLOAD_FOLDER, filename)
中覆盖全局名称 path = os.getcwd()
的可能问题,因为 UPLOAD_FOLDER
正在使用 path = os.getcwd()
生成路径,请尝试更改到 file_path
像这样 file_path = os.path.join(UPLOAD_FOLDER, filename)
然后把这个 file_path
传给 bpy
像这样 bpy.ops.import_scene.gltf(filepath=file_path)
这可能会有所帮助,因为错误表明 NoneType
没有属性 scene
,这可能对提供给 bpy
.
的错误路径是正确的
bpy.context.window.scene = bpy.data.scenes[gltf.blender_scene]
AttributeError: 'NoneType' object has no attribute 'scene'
我发现我安装的bpy模块不对。我认为 bpy 应该作为一个完整的模块工作,因为我在 pip 中找到了它(我使用 pip install bpy
安装)但实际上它假定该模块在 Blender 的应用程序内控制台上是 运行。因此,不是通过 python index.py
运行ning 应用程序,而是先在后台 运行ning Blender,然后 运行ning python 在其之上解决了问题。 blender --background python index.py
我一直在使用 javascript 并且最近开始 python 使用 blender-python 库。(bpy) 所以这个问题可能是我的一些误解,因为缺少语言行为知识。
这个函数使用bpy。我进行了测试,它成功地将 .gltf 文件转换为 .fbx。
import os
import bpy
path = os.getcwd()
UPLOAD_FOLDER = os.path.join(path, 'uploads')
DOWNLOAD_FOLDER = os.path.join(path, 'downloads')
def gltf_to_fbx(filename):
path = os.path.join(UPLOAD_FOLDER, filename)
bpy.ops.import_scene.gltf(filepath = path)
portion = os.path.splitext(filename)
newname = portion[0] + ".fbx"
path_to_file = os.path.join(DOWNLOAD_FOLDER, newname)
bpy.ops.export_scene.fbx(filepath = path_to_file)
bpy.ops.object.delete()
gltf_to_fbx("1.gltf")
但是,当我像这样在 flask app router 中 运行 它时,它会抛出一个错误
from flask import Flask, flash, request
app = Flask(__name__)
@app.route('/', methods=['POST'])
def upload_file():
file = request.files['model']
filename = secure_filename(file.filename)
save_path = os.path.join(UPLOAD_FOLDER, filename)
file.save(save_path)
gltf_to_fbx(filename)
flash('File successfully uploaded')
return "Success"
if __name__ == "__main__":
app.run(host="localhost", port = 5000)
这是错误信息
...
File "index.py", line 62, in upload_file
gltf_to_fbx("1_1.gltf")
File "index.py", line 32, in gltf_to_fbx
bpy.ops.import_scene.gltf(filepath = path)
File "C:\ProgramData\Blender Foundation\Blender.82\scripts\modules\bpy\ops.py", line 201, in __call__
ret = op_call(self.idname_py(), None, kw)
RuntimeError: Error: Traceback (most recent call last):
File "C:\ProgramData\Blender Foundation\Blender.82\scripts\addons\io_scene_gltf2\__init__.py", line 850, in
execute
return self.import_gltf2(context)
File "C:\ProgramData\Blender Foundation\Blender.82\scripts\addons\io_scene_gltf2\__init__.py", line 869, in
import_gltf2
return self.unit_import(self.filepath, import_settings)
File "C:\ProgramData\Blender Foundation\Blender.82\scripts\addons\io_scene_gltf2\__init__.py", line 887, in
unit_import
BlenderGlTF.create(self.gltf_importer)
File "C:\ProgramData\Blender Foundation\Blender.82\scripts\addons\io_scene_gltf2\blender\imp\gltf2_blender_gltf.py", line 41, in create
BlenderScene.create(gltf, scene_idx)
File "C:\ProgramData\Blender Foundation\Blender.82\scripts\addons\io_scene_gltf2\blender\imp\gltf2_blender_scene.py", line 53, in create
bpy.context.window.scene = bpy.data.scenes[gltf.blender_scene]
AttributeError: 'NoneType' object has no attribute 'scene'
location: C:\ProgramData\Blender Foundation\Blender.82\scripts\modules\bpy\ops.py:201
错误消息似乎是说它无法导入文件,因为它...错误?但这没有意义,因为它在 运行 在 Flask 应用程序之外时没有抛出错误。
我想也许文件在 bpy 尝试加载它之前没有保存,但没有。我还尝试了 运行 将 gltf_to_fbx
函数与已保存的文件路径结合使用,它仍然会抛出相同的错误。 我能想到的唯一原因是 bpy 在全局范围内工作,但在 flask 应用程序中不工作。这对我来说听起来很奇怪。
欢迎任何意见。谢谢!
编辑
我刚刚注释掉了 bpy 模块中的错误行。然后它又抛出一个错误,我也把它注释掉了。现在可以了!不过,我对这种解决方案并不感到自豪。我的假设是 bpy 仅设计为 运行 在 Blender 控制台上。所以 import_scene.gltf
函数假设系统有 运行ning Blender 上下文,在这种情况下它没有。(仍然存在问题;它是如何 运行 在全局范围内没有错误的?)我发现这个文档解释了如何在 Blender 之外构建一个看起来很有希望的模块。 https://wiki.blender.org/wiki/Building_Blender/Windows
在 gltf_to_fbx
函数行 path = os.path.join(UPLOAD_FOLDER, filename)
中覆盖全局名称 path = os.getcwd()
的可能问题,因为 UPLOAD_FOLDER
正在使用 path = os.getcwd()
生成路径,请尝试更改到 file_path
像这样 file_path = os.path.join(UPLOAD_FOLDER, filename)
然后把这个 file_path
传给 bpy
像这样 bpy.ops.import_scene.gltf(filepath=file_path)
这可能会有所帮助,因为错误表明 NoneType
没有属性 scene
,这可能对提供给 bpy
.
bpy.context.window.scene = bpy.data.scenes[gltf.blender_scene]
AttributeError: 'NoneType' object has no attribute 'scene'
我发现我安装的bpy模块不对。我认为 bpy 应该作为一个完整的模块工作,因为我在 pip 中找到了它(我使用 pip install bpy
安装)但实际上它假定该模块在 Blender 的应用程序内控制台上是 运行。因此,不是通过 python index.py
运行ning 应用程序,而是先在后台 运行ning Blender,然后 运行ning python 在其之上解决了问题。 blender --background python index.py