【问题标题】:How to run pycharm unittests when standard lib is zipped?压缩标准库时如何运行pycharm单元测试?
【发布时间】:2014-07-28 07:53:56
【问题描述】:

我一直在尝试将基于 Maya 的 python 项目移植到 PyCharm,但在运行单元测试时遇到了问题。

Maya 提供了自己的 Python 解释器 (mayapy.exe) 和 Python 标准库的压缩版本(在本例中为“Python27.zip”)AFAIK 此处的标准库没有什么特别之处,但要运行本地 Maya 函数,您可以必须使用 MayaPy 而不是通用 python。

问题似乎是 jetBrains 测试运行程序 (utRunner.py) 想要获取 os.system 并且它很麻烦,因为它使用了一个不允许 zip 文件的特定导入例程。它尝试这样做:

def import_system_module(name):
  if sys.platform == "cli":    # hack for the ironpython
      return __import__(name)
  f, filename, desc = imp.find_module(name)
  return imp.load_module('pycharm_' + name, f, filename, desc)

并失败并出现此错误:

 ImportError: No module named os

我认为是因为这绕过了 zip 导入钩子。

还有one solution posted here,基本就是解压标准库的zip。我不愿意这样做,因为我可能需要在我没有管理员权限的机器上运行测试。我也不愿意修补上面的代码,因为我不清楚它如何适应整个测试过程。

那么:如何使用 PyCharm 使用压缩的标准库运行测试,而无需解压缩库或过多地调整 PyCharm 安装?

【问题讨论】:

    标签: python unit-testing pycharm maya python-unittest


    【解决方案1】:

    对于潜伏者:我找不到比上面链接的解决方案更好的解决方案,因此有必要将 2.7 标准库解压缩到一个松散的文件夹中。不优雅,但很有效。

    maya 用户需要注意的另一个问题是:PyCharm 不喜欢运行 Maya.standalone 的测试——独立会话没有正确退出,因此在运行测试时(在 onr 或更多文件中)调用

     import maya.standalone
     maya.standalone.initialize()
    

    pycharm 测试运行器将在完成时挂起。经过一番挫折后,我发现在测试代码中添加一个atexit 处理程序将允许独立设备以 PyCharm 可以容忍的方式退出:

    def get_out_of_maya():
        try:
           import maya.commands as cmds
           cmds.file(new=True, force=True)
        except:
           pass
        os._exit(0)   # note underscore
    
    import atexit
    atexit.register(get_out_of_maya)
    

    这会抢占 Maya 中的 atexit 挂钩,并允许完成测试以使 Pycharm 运行程序满意。 FWIW,如果您从子进程运行 MayaPy.exe 并以这种方式执行测试,它也会有所帮助。

    【讨论】:

    • 您最终将压缩文件解压到了哪里?您是否手动将它们添加到您的 sys.path 中?或者你的“最干净”的解决方案是什么?
    • 我最终将它们解压缩到一个或多或少随机的位置,然后确保特定于 pycharm 的环境 var PYCHARM_HELPERS_DIRC 指向它(注意最后的 C)仍然没有被设置迷住,但它有效
    • 我也在 PyCharm 中运行 mayapy.exe,我可以说这个解决方案不起作用。我几乎尝试了所有方法,但似乎无法阻止它崩溃,所以我要放弃了
    • 五年过去了,Maya 和 Pycharm 都发生了很大的变化。 MayaCharm 插件的作者在这里闲逛:tech-artists.slack.com,也许能帮到你
    【解决方案2】:

    我最终只是编辑了 Pycharm 的 utrunner.py 文件。它已经在文件顶部导入了 os,所以我不确定它为什么调用 import_system_module。导入命令会自动处理 zip 文件。此外,如果您将 maya.standalone 放在运行程序文件中,则无需在任何测试文件中调用它。

    #os = import_system_module("os")
    #re = import_system_module("re")
    import re
    try:
      import maya.standalone
      maya.standalone.initialize()
    except ImportError:
      pass
    

    我正在使用 Pycharm 5.0.1。

    【讨论】:

    • 这对我有用 - 但我必须与 Windows 权限作斗争才能更改文件。
    猜你喜欢
    • 1970-01-01
    • 2017-01-19
    • 2016-08-19
    • 2019-01-15
    • 1970-01-01
    • 2014-04-08
    • 2015-06-22
    • 2016-01-18
    • 1970-01-01
    相关资源
    最近更新 更多