如何在压缩标准库时运行pycharm单元测试?

时间:2014-06-06 23:33:03

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

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

Maya提供了自己的python解释器(mayapy.exe),其中包含python stdlib的压缩版本(在本例中为'Python27.zip')AFAIK这里没有关于stdlib的特别之处,但要运行本机maya函数你必须使用MayaPy而不是通用python。

问题似乎是jetBrains测试运行器(utRunner.py)想得到os.system并且它正在进行barfing,因为它使用了一个不允许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使用压缩的standardlib运行测试,而无需解压缩库或调整PyCharm安装太多?

2 个答案:

答案 0 :(得分:1)

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

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

 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并以这种方式执行测试,它也会有所帮助。

答案 1 :(得分:0)

我最终只是编辑了Pycharm的utrunner.py文件。它已经在文件的顶部导入了os,所以我不确定它为什么调用import_system_module。 import命令自动处理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。