Importing numpy fails when CPython is compiled to a DLL
まだ誰も着手していません。
評価
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 初心者へのやさしさ
- 25/100
- issue の種類
- バグ
- 明瞭さ
- 説明が足りない
- 活発さ
- 停滞
調査の方向性
CPython のファイルやテストは指定されていません。まず、DLL 構成とコンソール構成で、示されているエントリポイント PyImport_Import、PyRun_SimpleString、PyObject_CallObject を使って失敗を再現し、django と動作を比較してください。CPython と埋め込み設定のどちらが原因かを特定し、再現可能な診断を文書化できれば完了です。
索引モデルが issue の本文から書いたものです。
説明
I am trying to use numpy 1.22.3 with embedded python 3.9.12 or 3.10.2 compiled to a DLL on Windows 10.0.19044.
I've added numpy to embedded python by first installing it to the system python of the same version, then copying the new folders from Lib/site-packages to python3x.zip/site-packages. I have also installed numpy by first installing pip with get-pip from PyPa, but get the same results.
Importing numpy fails in three ways:
When compiling to a UWP DLL or standard DLL without unzipping python3x.zip, I get the following error:
ImportError('
IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE!
Importing the numpy C-extensions failed. This error can happen for many reasons, often due to issues with your setup or how NumPy was installed.
We have compiled some common reasons and troubleshooting tips at: https://numpy.org/devdocs/user/troubleshooting-importerror.html
Please note and check the following:
* The Python version is: Python3.10 from "C:\\Users\\jtemplin\\git\\PythonInterpreterDLL\\x64\\Debug\\PythonInterpreterTests\\AppX\\PythonInterpreterTests.exe"
* The NumPy version is: "1.22.3"
and make sure that they are the versions you expect.
Please carefully study the documentation linked above for further help.
Original error was: No module named \'numpy.core._multiarray_umath\'
')
This happens in debug and release builds. Other recommendations on the linked troubleshooting page either didn't apply or made no difference.
However, if I unzip the python3x.zip I get different errors:
When compiling to a UWP DLL and and importing numpy in python using PyObject_CallObject I get the following error:
Traceback (most recent call last):
File "C:\path-to-build\tests.py", line 37, in import_numpy_exception
import numpy
File "C:\path-to-build\python310.zip\site-packages\numpy\__init__.py", line 128, in <module>
from numpy.__config__ import show as show_config
File "C:\path-to-build\python310.zip\site-packages\numpy\__config__.py", line 13, in <module>
os.add_dll_directory(extra_dll_dir)
File "os.py", line 1117, in add_dll_directory
OSError: [WinError 87] The parameter is incorrect: 'C:\\path-to-build\\python310.zip\\site-packages\\numpy\\.libs'
The path that os.add_dll_directory is trying to add exists, and the function works if I call it manually in a python shell.
When compiling to a standard DLL I can call os.add_dll_directory using PyRun_SimpleString, but still can't import numpy. I've tried PyImport_Import("numpy"), PyImport_ImportModule("numpy"), PyImport_AddModule("numpy") and they all return nullptr. I've also tried importing numpy in python using PyObject_CallObject and it fails with the following error:
Assertion failed: !PyErr_Occurred(), file D:\a\1\s\Objects\typeobject.c, line 3264
All of the above functions are able to import django successfully, so I don't believe it is a simple path issue. They also import numpy successfully when running in a console app.
So why does importing numpy fail in a DLL?
Here are some code samples that work with django, but not numpy:
bool PythonInterpreter::importModule(const char* moduleName) {
// moduleName = "numpy" or "django"
auto pyModuleName = PyUnicode_FromString(moduleName);
auto module = PyImport_Import(pyModuleName);
auto result1 = !(nullptr == module);
auto module2 = PyImport_ImportModule(moduleName);
auto result2 = !(nullptr == module2);
auto module3 = PyImport_AddModule(moduleName);
auto result3 = !(nullptr == module3);
return result1 || result2 || result3;
}
bool PythonInterpreter::importSimpleString(const char* importString) {
// importString = "import numpy" or "import django"
auto result = 0 == PyRun_SimpleString(importString);
return result;
}
bool PythonInterpreter::importWithException(const char* functionName) {
// functionName = "import_numpy" or "import_django"
auto importNumpyEx = PyObject_GetAttrString(this->testModule, functionName);
auto result = _PyUnicode_AsString(PyObject_CallObject(importNumpyEx, NULL));
return 0 == strcmp(result, "PASS");
}
def import_django():
try:
import django
return "PASS"
except OSError as e:
return full_stack() # lifted from stackexchange
def import_numpy():
try:
import numpy
return "PASS"
except OSError as e:
return full_stack() # lifted from stackexchange
def full_stack():
import traceback, sys
exc = sys.exc_info()[0]
stack = traceback.extract_stack()[:-1] # last one would be full_stack()
if exc is not None: # i.e. an exception is present
del stack[-1] # remove call of full_stack, the printed exception
# will contain the caught exception caller instead
trc = 'Traceback (most recent call last):\n'
stackstr = trc + ''.join(traceback.format_list(stack))
if exc is not None:
stackstr += ' ' + traceback.format_exc().lstrip(trc)
return
- 主要言語
- Python
- スター
- 77.2k
- フォーク
- 36k
- 平均マージ
- 1日 9時間
- マージ済み PR(30日)
- 558
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
python/cpython のほかの issue
-
docs pending
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
-
stdlib type-feature
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
-
stdlib type-feature
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
-
build type-bug
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
-
stdlib topic-email type-feature
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
似ている issue
-
area/auth bug comp/agent P3 platform/discord type/security
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
NousResearch/hermes-agent#117848 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
bancolombia/sentinel#23 ·
-
test md オープンCI
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
-
integration:quickjs org:external priority:backlog topic:code-interpreter topic:middleware type:feature
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
langchain-ai/deepagents#6450 ·
-
bug client
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100