• 六、提示和技巧


    Tips and Tricks

    这里有一些对你写脚本有用的建议。

    有些是Python的特性,脚本程序可能没有想到要用Blender,其他的都是特定于Blender的。

    1  Use The Terminal 使用终端

    写Python脚本时,有一个终端打开是很有用的,这不是内置的Python控制台,而是一个用于启动Blender的终端应用程序。

    使用终端有三个用处:

    There are 3 main uses for the terminal, these are:

    • 你可以使用print()来显示调试信息
    • 错误追踪将会完全显示在终端中,而Blender的控制台不总是提示错误,这取决于脚本如何执行
    • 如果你的脚本跑了太长时间,或是误入一个死循环,使用Ctrl-C 可以提前结束

    注意:

    对Linux and OSX 用户,这意味着首先启动终端,然后运行 Blender . Windows 上的终端可以在 help menu打开.

    2  Interface Tricks 界面技巧

    2.1 Access Operator Commands 获取操作命令

    你可能会注意到,工具提示信息下面会有bpy.ops.[...]这样的命令来执行某个按钮,你可以直接使用Ctrl-C 将这个命令拷贝到剪切板

    2.2 Access Data Path

    从 ID 数据块中获取它的路径并不简单,因为它经常是嵌套的. 为了快速获取你可以右击按钮选择 Copy Data Path,如果获取不道德话,你就会只复制到属性名。

    注意:

    这使用相同的方法创建动画路径通过 bpy.types.FCurve.data_path 和 bpy.types.DriverTarget.data_path这两个驱动。

    3  Show All Operators 显示所有操作

    Blender只在信息窗口中记录启用EGISTER选项的操作,这样不至于像 bpy.ops.view3d.smoothview and bpy.ops.view3d.zoom这样的操作记录淹没信息窗口。

    然而,对于测试它可以很有用,你可以看到每个操作显示终端。你可以启用debug选项或者当启动Blender时传递一个 --debug-wm参数,如果Blender正在运行你可以设置bpy.app.debug_wm为True.

    4  Use an External Editor  使用外部编辑器

    Blenders文本编辑器对于小的修改和编写测试来说是很好的,但对于更大的项目,您可能想要使用独立的编辑器或Python IDE。

    在外部编辑文本文件,并在Blender中打开相同的文本,但这并不是最理想的,所以这里有两种方法,可以很容易地使用来自Blender的外部文件。

    使用下面的例子,您仍然需要在Blender中使用textblock来执行,但是引用一个外部文件,而不是直接包含它。

    4.1 Executing External Scripts  执行外部脚本

    这相当于直接运行脚本,引用一个从2行文本块中编写的脚本路径。

    filename = "/full/path/to/myscript.py"
    exec(compile(open(filename).read(), filename, 'exec'))

    您可能需要引用一个相对于混合文件的脚本。

    import bpy
    import os
    
    filename = os.path.join(os.path.dirname(bpy.data.filepath), "myscript.py")
    exec(compile(open(filename).read(), filename, 'exec'))

    4.2 Executing Modules

    这个示例显示了将脚本装入模块并执行模块函数。

    import myscript
    import importlib
    
    importlib.reload(myscript)
    myscript.main()

    注意,脚本每次都被重新加载,这迫使使用了修改后的版本,否则缓存在sys中。模块将被使用直到Blender重新启动。

    这个和执行脚本的重要区别在于它必须调用模块中的一个函数,这个例子中是 main(),也可以是其他任何函数。 这样做的一个优点是,您可以将参数从这个小脚本传递给函数,这个脚本通常用于快速测试不同的设置。

    另一个问题是脚本必须在Pythons模块搜索路径中。虽然这并不是最佳实践,但为了测试您可以扩展搜索路径,这个示例将当前的混合文件目录添加到搜索路径,然后将脚本加载为一个模块。

    import sys
    import os
    import bpy
    
    blend_dir = os.path.dirname(bpy.data.filepath)
    if blend_dir not in sys.path:
       sys.path.append(blend_dir)
    
    import myscript
    import importlib
    importlib.reload(myscript)
    myscript.main()

    5  Don’t Use Blender!

    在开发您自己的脚本时,Blenders接口可能会妨碍您手动重新加载、运行脚本、打开文件导入等。

    对于那些不是交互式的脚本,它可以更有效地避免使用Blenders接口,而是在命令行上执行脚本。

    blender --background --python myscript.py

    您可能想要使用blend文件运行此脚本,因此脚本有一些要操作的数据。

    blender myscene.blend --background --python myscript.py

    注意:

    根据您的设置,您可能必须输入到Blender可执行文件的完整路径。

    一旦脚本在后台模式中正常运行,您将需要检查脚本的输出,这完全取决于手头的任务。这是些建议

    • 将输出渲染成图像,使用图像查看器,每次都保持相同的图像。
    • 保存一个新的blend文件,或者使用一种导出文件。
    • 如果结果可以显示为文本——打印或写入文件。

    尽管这可能需要一点时间设置,它可以是非常值得的努力减少测试时间的变化——你甚至可以用Blender运行脚本每隔几秒钟查看更新结果,所以不需要离开你的文本编辑器你就能看到变化。

    6  Use External Tools 使用外部工具

    当没有现成的Python模块来执行特定任务时,需要记住的是,您可以让Python对您的数据执行外部命令并将结果读入。

    使用外部程序增加了额外的依赖,并可能限制谁可以使用脚本,但要快速设置自己的定制管道或编写一次性脚本,这很方便。

    例如:

    • 在批量模式下运行Gimp,以执行高级图像处理的自定义脚本
    • 输出3D模型,使用外部网格操作工具,并读取结果。
    • 在阅读前将文件转换成可识别的格式

    7  Bundled Python & Extensions   Python绑定和扩展

    从blender.org发布的Blender版本包括一个完整的Python安装在所有平台上,这是一个缺点,你在系统Python中安装的任何扩展都不会通过Blender找到。

    有两种解决方法:

    • 移除 Blender Python 子目录, Blender 将使用系统原来安装的Python.

      取决于你的平台,你应当使用PYTHONPATHenvironment 变量来告诉Blender你的Python安装位置, eg:

      PYTHONPATH=/usr/lib/python3.5 ./blender

      注意:

      Python版本必须和Blender支持的一致.

    • 将扩展复制或链接到Blender的Python子目录,这样Blender就可以访问它们,也可以将整个Python安装复制到Blenders子目录中,替换掉Blender自带的。只要Python版本匹配,并且路径在相同的相对位置创建,就可以工作。这样做有好处,你可以用Blender和/或游戏播放器重新分配这个包,包括你依赖的任何扩展。

    8  Drop Into a Python Interpreter in Your Script 在脚本中加入Python解释器

    在脚本的中间,您可能想要检查一些变量,运行一些函数,并且通常会挖掘出正在发生的事情。

    import code
    code.interact(local=locals())

    如果你想同时获取全局和局部变量,你可以这样做:

    import code
    namespace = globals().copy()
    namespace.update(locals())
    code.interact(local=namespace)

    下一个示例是上面的脚本的等效单行版本,更容易在代码中粘贴:

    __import__('code').interact(local=dict(globals(), **locals()))

    code.interact 可以在脚本的任意行添加并将暂停脚本在终端启动一个交互式解释器,当您完成时,您可以退出解释器,脚本将继续执行。

    如果您安装了IPython,您可以使用它的embed()函数,它使用当前名称空间。IPython提示符具有自动完成功能,以及标准Python eval- loop没有的一些有用特性。

    import IPython
    IPython.embed()

    不可否认的是,这凸显了在Blender中没有任何Python调试支持,但它仍然很方便。

    注意:

    这也适用于游戏引擎,它可以方便地检查运行游戏的状态。

    9  Advanced 高级

    9.1 Blender as a module

    从Python的角度来看,把所有的东西都当作一个扩展,让Python脚本可以结合许多组件,这是比较好的。

    优点:

    • 您可以使用外部编辑器/ IDE,使用Blenders Python API,并在IDE中执行脚本(一步一步执行,在脚本运行时观察变量)。
    • 编辑器/ IDE可以自动完成Blender模块和变量
    • 现有的脚本可以导入Blender API而不必运行在Blender里面。

    这是高级的,因为作为Python模块运行Blender需要一个特殊的构建选项。

    如何编译请参见 Building Blender as a Python module

    9.2 Python Safety (Build Option)

    由于可以访问已删除的数据(参见Gotcha的),因此很难找到崩溃的原因。

    要在访问自由数据(而不是崩溃)时提高Python异常,可以启用CMake构建选项WITH_PYTHON_SAFETY。

    这使数据跟踪能够使数据访问速度慢两倍,这就是为什么在发布版本中不启用该选项的原因。

  • 相关阅读:
    [Leetcode] Convert Sorted List to Binary Search Tree
    [Leetcode] Sqrt(x)
    [Leetcode] Pow(x, n)
    [Leetcode] Balanced Binary Tree
    [Leetcode] Convert Sorted Array to Binary Search Tree
    [Leetcode] Construct Binary Tree from Preorder and Inorder Traversal
    [Leetcode] Remove Element
    [Leetcode] Letter Combinations of a Phone Number
    [Leetcode] Generate Parentheses
    [Leetcode] Valid Parentheses
  • 原文地址:https://www.cnblogs.com/wildbloom/p/7763659.html
Copyright © 2020-2023  润新知