首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QuantLib-SWIG 1.19 python 'from . import _QuantLib‘失败

QuantLib-SWIG 1.19 python 'from . import _QuantLib‘失败
EN

Stack Overflow用户
提问于 2020-09-03 21:32:58
回答 1查看 479关注 0票数 1

我下载了Windows10下的QuantLib-SWIG-1.19。

我能够构建并安装python版本。

但是,当它尝试运行build_ext时,它无法通过测试。

代码语言:javascript
复制
SET QL_DIR=C:\Users\admuser\Workspace\QuantLib-1.19
SET INCLUDE=C:\Users\admuser\ThirdParty\boost_1_74_0;%INCLUDE%                             
SET LIB=C:\Users\admuser\ThirdParty\boost_1_74_0;%LIB%
set PATH=%PATH%;C:\Users\admuser\ThirdParty\swigwin\swigwin-4.0.2

cd C:\Users\admuser\Workspace\QuantLib-SWIG-1.19\Python

调用了以下命令

代码语言:javascript
复制
python setup.py build
python setup.py install
python setup.py test

build_ext的python setup.py测试失败

代码语言:javascript
复制
running test
running build
running build_py
running build_ext
Traceback (most recent call last):
  File "setup.py", line 237, in <module>
    setup(name             = "QuantLib",
  File "C:\Users\admuser\ThirdParty\WinPython\python-3.8.2.amd64\lib\site-packages\setuptools\__init__.py", line 144, in setup
    return distutils.core.setup(**attrs)
  File "C:\Users\admuser\ThirdParty\WinPython\python-3.8.2.amd64\lib\distutils\core.py", line 148, in setup
    dist.run_commands()
  File "C:\Users\admuser\ThirdParty\WinPython\python-3.8.2.amd64\lib\distutils\dist.py", line 966, in run_commands
    self.run_command(cmd)
  File "C:\Users\admuser\ThirdParty\WinPython\python-3.8.2.amd64\lib\distutils\dist.py", line 985, in run_command
    cmd_obj.run()
  File "setup.py", line 61, in run
    module = __import__('QuantLibTestSuite', globals(), locals(), [''])
  File "test\QuantLibTestSuite.py", line 22, in <module>
    from date import DateTest
  File "test\date.py", line 18, in <module>
    import QuantLib as ql
  File "build\lib.win-amd64-3.8\QuantLib\__init__.py", line 21, in <module>
    from .QuantLib import *
  File "build\lib.win-amd64-3.8\QuantLib\QuantLib.py", line 13, in <module>
    from . import _QuantLib
ImportError: DLL load failed while importing _QuantLib: The parameter is incorrect.

setup.py build创建了一个包含临时目录和库目录的文件夹:

代码语言:javascript
复制
    QuantLib-SWIG-1.19\Python\build\lib.win-amd64-3.8\QuantLib
    which contains
        __init__.py
        _QuantLib.cp38-win_amd64.pyd
        QuantLib.py

setup.py install增加了:

代码语言:javascript
复制
QuantLib-SWIG-1.19\Python\QuantLib.egg-info
QuantLib-SWIG-1.19\Python\build\lib.win-amd64-3.8\QuantLib\__pycache__
python-3.8.2.amd64\Lib\site-packages\QuantLib-1.19-py3.8-win-amd64.egg

python-3.8.2.amd64\Lib\site-packages\QuantLib-1.19-py3.8-win-amd64.egg\QuantLib 
which contains:
        __pycache__ folder
        __init__.py
        _QuantLib.cp38-win_amd64.pyd
        _QuantLib.py
        QuantLib.py

所以我尝试导入QuantLib:

我打开一个管理命令提示符窗口,它可以正常工作:

代码语言:javascript
复制
C:\WINDOWS\system32>python
Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import QuantLib as ql
>>> QuantLib.__file__
'C:\\Users\\admuser\\ThirdParty\\WinPython\\python-3.8.2.amd64\\lib\\site-packages\\quantlib-1.19-py3.8-win-amd64.egg\\QuantLib\\__init__.py'
>>>

但是然后我cd C:\Users\admuser\Workspace\QuantLib-SWIG-1.19\Python

(我需要在那里cd才能运行python setup.py)

代码语言:javascript
复制
C:\Users\admuser\Workspace\QuantLib-SWIG-1.19\Python>python
Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>import QuantLib as ql
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\admuser\Workspace\QuantLib-SWIG-1.19\Python\QuantLib\__init__.py", line 21, in <module>
    from .QuantLib import *
  File "C:\Users\admuser\Workspace\QuantLib-SWIG-1.19\Python\QuantLib\QuantLib.py", line 13, in <module>
    from . import _QuantLib
ImportError: cannot import name '_QuantLib' from partially initialized module 'QuantLib' (most likely due to a circular import) (C:\Users\admuser\Workspace\QuantLib-SWIG-1.19\Python\QuantLib\__init__.py)
>>>
´´´
EN

回答 1

Stack Overflow用户

发布于 2020-09-04 21:33:07

在我上面的描述中,如果您不在Quantlib -SWIG 1.19\ python目录中,您可以从命令行Python提示符导入QuantLib。

这是因为python查看site-packages文件夹,该文件夹包含引导文件_QuantLib.py。

如果您在QuantLib-SWIG 1.19\Python目录中,它会在QuantLib-SWIG 1.19\Python\QuantLib目录中查找,该目录没有_QuantLib.py或相关的_QuantLib.cp38-win_amd64.pyd文件。

为了让它工作,我们直接加载了_QuantLib模块:

来自QuantLib.py

代码语言:javascript
复制
# Import the low-level C/C++ module
if __package__ or "." in __name__:
    from . import _QuantLib
else:
    import _QuantLib

在语句“From.Import _QuantLib”上方找不到_QuantLib

因此,我们尝试直接加载它:

代码语言:javascript
复制
# Import the low-level C/C++ module
if __package__ or "." in __name__:
    import importlib.util
    import sys
    _quantLib_spec=importlib.util.find_spec("_QuantLib")
    if _quantLib_spec is None:
        print("cannot find _QuantLib (bootstrap) module")
        print(sys.path)
    else:
        _QuantLib=importlib.util.module_from_spec(_quantLib_spec)
        _quantLib_spec.loader.exec_module(_QuantLib)
        sys.modules[_QuantLib] = _QuantLib
else:
    import _QuantLib

我可能应该检测一下这是否是QuantLib模块的站点包版本,然后调用‘From.Import _QuantLib’。

我们需要设置PYTHONPATH (如果我们使用的不是site_packages版本):

代码语言:javascript
复制
set PYTHONPATH=C:\\admuser\\OneDrive\\ThirdParty\\WinPython\\python-3.8.2.amd64\\lib\\site-packages\\quantlib-1.19-py3.8-win-amd64.egg\\QuantLib
代码语言:javascript
复制
C:\Users\admuser\Workspace\QuantLib-SWIG-1.19\Python>python
Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import QuantLib
>>> exit()

C:\Users\admuser\Workspace\QuantLib-SWIG-1.19\Python>python examples\swap.py
0.0443
NPV         = 19066.26
Fair spread = -0.4174 %
Fair rate   =  4.4300 %
NPV         = 19066.26
Fair spread = -0.4174 %
Fair rate   =  4.4300 %
NPV         = 40533.04
Fair spread = -0.9241 %
Fair rate   =  4.9520 %
NPV         = 37144.28
Fair spread = -0.8469 %
Fair rate   =  4.8724 %
NPV         = 26604.08
Fair spread = -0.5825 %
Fair rate   =  4.6000 %
NPV         = 46439.43
Fair spread = -1.0588 %
Fair rate   =  5.0907 %
NPV         = 26604.08
Fair spread = -0.5825 %
Fair rate   =  4.6000 %
NPV         = 43050.66
Fair spread = -0.9815 %
Fair rate   =  5.0111 %

C:\Users\admuser\Workspace\QuantLib-SWIG-1.19\Python>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63724776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档