问题描述
我下载了适用于Windows 10的QuantLib-SWIG-1.19。
我能够构建和安装python版本。
但是尝试运行build_ext时,测试失败。
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
称为以下命令
python setup.py build
python setup.py install
python setup.py test
python setup.py的build_ext测试失败
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构建创建了一个包含临时目录和lib目录的文件夹:
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安装添加:
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:
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'
>>>
但是随后我将C:\ Users \ admuser \ Workspace \ QuantLib-SWIG-1.19 \ Python cd CD
(我需要在此安装cd才能运行python setup.py)
C:\Users\admuser\Workspace\QuantLib-SWIG-1.19\Python>python
Python 3.8.2 (tags/v3.8.2:7b3ab59,"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",in <module>
from .QuantLib import *
File "C:\Users\admuser\Workspace\QuantLib-SWIG-1.19\Python\QuantLib\QuantLib.py",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)
>>>
´´´
解决方法
在上面的描述中,如果您不在QuantLib-SWIG-1.19 \ Python目录中,则可以从命令行python提示符下导入Quantlib。
这是因为python在带有自举文件_QuantLib.py的site-packages文件夹中查找。
如果您在QuantLib-SWIG-1.19 \ Python目录中,它将在没有_QuantLib.py或关联的_QuantLib.cp38-win_amd64.pyd文件的QuantLib-SWIG-1.19 \ Python \ QuantLib指令中查找。 / p>
要使其正常工作,我们直接加载了_QuantLib模块:
来自QuantLib.py
# Import the low-level C/C++ module
if __package__ or "." in __name__:
from . import _QuantLib
else:
import _QuantLib
在'from的声明中。 import _QuantLib'找不到_QuantLib
因此,我们尝试直接加载它:
# 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'。导入_QuantLib'
我们需要设置PYTHONPATH(如果我们不使用site_packages版本):
set PYTHONPATH=C:\\admuser\\OneDrive\\ThirdParty\\WinPython\\python-3.8.2.amd64\\lib\\site-packages\\quantlib-1.19-py3.8-win-amd64.egg\\QuantLib
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>