【问题标题】:How to import Python modules provided by commercial software?如何导入商业软件提供的 Python 模块?
【发布时间】:2020-12-23 18:15:22
【问题描述】:

我想测试依赖于商业软件 Abaqus 提供的对象的 Python2 代码。我可以通过abaqus python 启动 Abaqus 附带的 Python 解释器:

适用于 Abaqus 2018 的 Python 2.7.3(默认,2017 年 9 月 9 日,03:28:08)

[GCC 4.9.2 20150212 (Red Hat 4.9.2-6)] 在 linux2 上

问题是当我尝试导入 Abaqus 提供的模块abaqus 时,出现错误:

abaqus 模块只能在 Abaqus 内核进程中导入

我在/some/path/下找到了模块的.pyc,并尝试按照here描述的答案执行编译后的代码:

import marshal

s = open('/some/path/abaqus.pyc', 'rb')
s.seek(8)  # go past first eight bytes
code_obj = marshal.load(s)
exec(code_obj)

但这会产生同样的错误。有什么方法可以将模块在 Abaqus 内核进程之外导入?

UPD 1

我尝试启动一个子进程,但无济于事。 我创建了一个文件my_test_script.py:

import subprocess
subprocess.call( ["pytest", "--version"] )

运行python my_test_script.py 产生:

This is pytest version 4.6.11, imported from /path/to/virtual/environment/pytest.pyc

通过 Abaqus 运行相同的脚本会导致以下错误:

$ abaqus cae nogui=my_test_script.py
Abaqus License Manager checked out the following license:
"cae" from Flexnet server licabaq1.lic
<39 out of 40 licenses remain available>.
ERROR:root:code for hash md5 was not found.
Traceback (most recent call last):
  File "/apps/Common/Core/ABAQUS/2018-linux-x86_64/cae/linux_a64/tools/SMApy/python2.7/lib/python2.7/hashlib.py", line 139, in <module>
    globals()[__func_name] = __get_hash(__func_name)
  File "/apps/Common/Core/ABAQUS/2018-linux-x86_64/cae/linux_a64/tools/SMApy/python2.7/lib/python2.7/hashlib.py", line 91, in __get_builtin_constructor
    raise ValueError('unsupported hash type %s' % name)
ValueError: unsupported hash type md5
ERROR:root:code for hash sha1 was not found.
Traceback (most recent call last):
  File "/apps/Common/Core/ABAQUS/2018-linux-x86_64/cae/linux_a64/tools/SMApy/python2.7/lib/python2.7/hashlib.py", line 139, in <module>
    globals()[__func_name] = __get_hash(__func_name)
  File "/apps/Common/Core/ABAQUS/2018-linux-x86_64/cae/linux_a64/tools/SMApy/python2.7/lib/python2.7/hashlib.py", line 91, in __get_builtin_constructor
    raise ValueError('unsupported hash type %s' % name)
ValueError: unsupported hash type sha1
ERROR:root:code for hash sha224 was not found.
Traceback (most recent call last):
  File "/apps/Common/Core/ABAQUS/2018-linux-x86_64/cae/linux_a64/tools/SMApy/python2.7/lib/python2.7/hashlib.py", line 139, in <module>
    globals()[__func_name] = __get_hash(__func_name)
  File "/apps/Common/Core/ABAQUS/2018-linux-x86_64/cae/linux_a64/tools/SMApy/python2.7/lib/python2.7/hashlib.py", line 91, in __get_builtin_constructor
    raise ValueError('unsupported hash type %s' % name)
ValueError: unsupported hash type sha224
ERROR:root:code for hash sha256 was not found.
Traceback (most recent call last):
  File "/apps/Common/Core/ABAQUS/2018-linux-x86_64/cae/linux_a64/tools/SMApy/python2.7/lib/python2.7/hashlib.py", line 139, in <module>
    globals()[__func_name] = __get_hash(__func_name)
  File "/apps/Common/Core/ABAQUS/2018-linux-x86_64/cae/linux_a64/tools/SMApy/python2.7/lib/python2.7/hashlib.py", line 91, in __get_builtin_constructor
    raise ValueError('unsupported hash type %s' % name)
ValueError: unsupported hash type sha256
ERROR:root:code for hash sha384 was not found.
Traceback (most recent call last):
  File "/apps/Common/Core/ABAQUS/2018-linux-x86_64/cae/linux_a64/tools/SMApy/python2.7/lib/python2.7/hashlib.py", line 139, in <module>
    globals()[__func_name] = __get_hash(__func_name)
  File "/apps/Common/Core/ABAQUS/2018-linux-x86_64/cae/linux_a64/tools/SMApy/python2.7/lib/python2.7/hashlib.py", line 91, in __get_builtin_constructor
    raise ValueError('unsupported hash type %s' % name)
ValueError: unsupported hash type sha384
ERROR:root:code for hash sha512 was not found.
Traceback (most recent call last):
  File "/apps/Common/Core/ABAQUS/2018-linux-x86_64/cae/linux_a64/tools/SMApy/python2.7/lib/python2.7/hashlib.py", line 139, in <module>
    globals()[__func_name] = __get_hash(__func_name)
  File "/apps/Common/Core/ABAQUS/2018-linux-x86_64/cae/linux_a64/tools/SMApy/python2.7/lib/python2.7/hashlib.py", line 91, in __get_builtin_constructor
    raise ValueError('unsupported hash type %s' % name)
ValueError: unsupported hash type sha512
Traceback (most recent call last):
  File "/path/to/virtual/environment/bin/pytest", line 8, in <module>
    sys.exit(main())
  File "/path/to/virtual/environment/lib/python2.7/site-packages/_pytest/config/__init__.py", line 65, in main
    config = _prepareconfig(args, plugins)
  File "/path/to/virtual/environment/lib/python2.7/site-packages/_pytest/config/__init__.py", line 214, in _prepareconfig
    pluginmanager=pluginmanager, args=args
  File "/path/to/virtual/environment/lib/python2.7/site-packages/pluggy/hooks.py", line 286, in __call__
    return self._hookexec(self, self.get_hookimpls(), kwargs)
  File "/path/to/virtual/environment/lib/python2.7/site-packages/pluggy/manager.py", line 93, in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
  File "/path/to/virtual/environment/lib/python2.7/site-packages/pluggy/manager.py", line 87, in <lambda>
    firstresult=hook.spec.opts.get("firstresult") if hook.spec else False,
  File "/path/to/virtual/environment/lib/python2.7/site-packages/pluggy/callers.py", line 203, in _multicall
    gen.send(outcome)
  File "/path/to/virtual/environment/lib/python2.7/site-packages/_pytest/helpconfig.py", line 94, in pytest_cmdline_parse
    config = outcome.get_result()
  File "/path/to/virtual/environment/lib/python2.7/site-packages/pluggy/callers.py", line 81, in get_result
    _reraise(*ex)  # noqa
  File "/path/to/virtual/environment/lib/python2.7/site-packages/pluggy/callers.py", line 187, in _multicall
    res = hook_impl.function(*args)
  File "/path/to/virtual/environment/lib/python2.7/site-packages/_pytest/config/__init__.py", line 789, in pytest_cmdline_parse
    self.parse(args)
  File "/path/to/virtual/environment/lib/python2.7/site-packages/_pytest/config/__init__.py", line 997, in parse
    self._preparse(args, addopts=addopts)
  File "/path/to/virtual/environment/lib/python2.7/site-packages/_pytest/config/__init__.py", line 938, in _preparse
    self._consider_importhook(args)
  File "/path/to/virtual/environment/lib/python2.7/site-packages/_pytest/config/__init__.py", line 886, in _consider_importhook
    self._mark_plugins_for_rewrite(hook)
  File "/path/to/virtual/environment/lib/python2.7/site-packages/_pytest/config/__init__.py", line 908, in _mark_plugins_for_rewrite
    for name in _iter_rewritable_modules(package_files):
  File "/path/to/virtual/environment/lib/python2.7/site-packages/_pytest/config/__init__.py", line 662, in _iter_rewritable_modules
    package_files = list(package_files)
  File "/path/to/virtual/environment/lib/python2.7/site-packages/_pytest/config/__init__.py", line 904, in <genexpr>
    if any(ep.group == "pytest11" for ep in dist.entry_points)
  File "/path/to/virtual/environment/lib/python2.7/site-packages/importlib_metadata/__init__.py", line 289, in entry_points
    return EntryPoint._from_text(self.read_text('entry_points.txt'))
  File "/path/to/virtual/environment/lib/python2.7/site-packages/importlib_metadata/__init__.py", line 138, in _from_text
    config.read_string(text)
  File "/path/to/virtual/environment/lib/python2.7/site-packages/backports/configparser/__init__.py", line 794, in read_string
    self.read_file(sfile, source)
  File "/path/to/virtual/environment/lib/python2.7/site-packages/backports/configparser/__init__.py", line 789, in read_file
    self._read(f, source)
  File "/path/to/virtual/environment/lib/python2.7/site-packages/backports/configparser/__init__.py", line 1193, in _read
    raise e
backports.configparser.ParsingError: Source contains parsing errors: u'<string>'
    [line  2]: u'\U00660000\U00320000\U00700000\U00790000\U00200000\U003d0000\U00200000\U006e0000\U00750000\U006d0000\U00700000\U00790000\U002e0000\U00660000\U00320000\U00700000\U00790000\U002e0000\U00660000\U00320000\U00700000\U00790000\U00320000\U00650000\U003a0000\U006d0000\U00610000\U00690000\U006e0000\U000a0000\x00\x00\x00\x00w_MapString1DArrayListInt.'
    [line  3]: u'\U00660000\U00320000\U00700000\U00790000\U00320000\U00200000\U003d0000\U00200000\U006e0000\U00770000config\x00c'

Abaqus 回放文件不包含任何对我有帮助的内容:

# from driverUtils import executeOnCaeGraphicsStartup
# executeOnCaeGraphicsStartup()
#: Executing "onCaeGraphicsStartup()" in the site directory ...
from abaqus import *
from abaqusConstants import *
session.Viewport(name='Viewport: 1', origin=(1.36719, 1.36719), width=201.25, 
    height=135.625)
session.viewports['Viewport: 1'].makeCurrent()
from driverUtils import executeOnCaeStartup
executeOnCaeStartup()
execfile('my_test_script.py', __main__.__dict__)
print 'RT script done'
#: RT script done

对输出有什么看法吗?

【问题讨论】:

  • 为什么不使用 CAE 解释器?我认为 Abaqus 专门保护了他们的库,因此它们只能与 CAE 许可证一起使用
  • 您的意思是我从交互式会话中运行测试吗?但后来我面临我的PyTest 安装在虚拟环境中的问题。像os.system('ml Python; source venv/bin/activate; python -m pytest unit_tests') 这样的东西不起作用。你看,我在集群上工作,不能全局安装包。
  • 如果可以从您的虚拟环境访问 Abaqus,那么您可以使用 subprocess 和“abaqus cae nogui=my_test_script.py”启动您的测试脚本。 subprocess 将允许您检索日志信息并因此在单元测试中使用它我猜
  • @RomanZhuravlev 它没有用。我用收到的错误消息更新了帖子

标签: python python-2.7 unit-testing abaqus


【解决方案1】:

我不确定最终是否理解了您问题的所有细节。例如,您想通过从“.pyc”文件执行代码来实现什么(顺便说一句,它包含什么?)?

无论如何,我在这里分享对我有用的例程。

  1. 创建脚本my_abaqus_script.py

注意:导入列表可能因您的需要而异

from abaqus import *
from abaqusConstants import *
from part import *
from sketch import *

m = mdb.Model(name='myModel')
a = abq_model.rootAssembly

my_sketch = m.ConstrainedSketch(name='my_sketch', sheetSize=24.0)

pivots = [(0., 0.), (0., 1.), (1., 1.), (1., 0.)]
n = len(pivots)
for i in range(n):
    my_sketch.Line(point1=pivot_pts[i], point2=pivot_pts[(i+1) % n])

my_part = m.Part(dimensionality=THREE_D, name='MyPart', type=DEFORMABLE_BODY)
my_part.BaseSolidExtrude(sketch=my_sketch, depth=1.0)

# ...and so on

  1. 在您的工作目录中启动子进程(参见subprocess.Popen 的文档以及如何从命令行执行abaqus 作业在“Abaqus 分析用户指南-> 介绍、空间建模和执行-> 作业执行-> 执行程序”)。您可以在任何 python 解释器中启动以下代码。
import subprocess
my_cmd = 'abaqus job=my_abaqus_script analysis cpus=1 interactive'

proc = subprocess.Popen(
   my_cmd,
   cwd=my_working_dir,
   stdout='my_study.log',
   stderr='my_study.err',
   shell=True
)

  1. 如果代码中的某些内容不起作用,我将打开 Abaqus CAE 并尝试在 Abaqus python 解释器(在窗口底部)中“按行”启动代码。您可以在那里研究不同的对象,以更好地了解 Abaqus 环境的工作原理。

【讨论】:

  • 感谢您的回答! .pyc 文件包含 Abaqus 对象(在您的示例中通过 from abaqus import * 导入)。我需要它们在 PyTest 中的单元测试例程中使用。所以我的问题是如何将 Abaqus 与 PyTest 结合起来?您的示例显示了如何将 Abaqus 作为子进程调用。你是否暗示我应该在测试例程的assert 语句中使用my_abaqus_script 的状态?
  • 嗯,你可以,是的。这就是我正在做的:一个模型生成测试; odb 后处理的一项测试;等
  • @honey_badger 您需要从 Abaqus 获得的任何东西都必须经过 abaqus.exe 进程。我不认为您可以从外部导入 Abaqus 的库,我不明白您为什么要这样做。此外,在 abaqus 脚本上运行单元测试(即使对于复杂的库)也不是很有效率,因为:(1)您无法修复 API 问题; (2)您通常可以信任 API 工作(除了汇编模块,这真的很糟糕); (3) 你不能真正隔离函数的输出,因为一切都很大而且很耗时。
猜你喜欢
  • 1970-01-01
  • 2021-02-21
  • 2018-05-01
  • 2014-11-12
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多