Python PyEval_CallObject和PyObject_CallObject返回空对象

Python PyEval_CallObject和PyObject_CallObject返回空对象,python,c++,python-embedding,Python,C++,Python Embedding,这是一个关于的后续问题。 正如前面的问题评论所指出的,我最初尝试导入模块是完全错误的,相反,我应该这样做: auto module=PyImport\u ImportModule(“Package1.Module1”); 所以我这样做了: auto模块=PyImport\u ImportModule(“FV.F\u V”); 完成此操作后,现在我得到了更有意义的输出,如您所见: module: 0000021306FF9B38 size: 30 FaceVerification: C:\Us

这是一个关于的后续问题。 正如前面的问题评论所指出的,我最初尝试导入模块是完全错误的,相反,我应该这样做:

auto module=PyImport\u ImportModule(“Package1.Module1”);
所以我这样做了:

auto模块=PyImport\u ImportModule(“FV.F\u V”);
完成此操作后,现在我得到了更有意义的输出,如您所见:

module: 0000021306FF9B38
size: 30
FaceVerification: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
Image: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
Path: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
__builtins__: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
__cached__: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
__doc__: FV.F_V
__file__: C:\Users\Master\Anaconda3\Lib\site-packages\FV\F_V.py
__loader__: FV
__name__: FV.F_V
__package__: FV
__spec__: FV
__warningregistry__ : C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
align_face: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
cv2: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
data_transforms: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
get_central_face_attributes: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
math: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
nn: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
np: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
os: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
pickle: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
plt: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
resnet101: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
resnet18: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
resnet50: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
scipy: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
time: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
torch: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
tqdm: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
transforms : C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
但是,当我尝试使用模块中定义的类(即
FaceVerification
并实例化它时,它失败了。 该类似乎正常,但尝试实例化该对象的调用返回空对象!: 我尝试了
PyEval\u CallObject
PyObject\u CallObject

auto-python_class=PyDict_GetItemString(pdict,“FaceVerification”);
if(PyCallable_检查(python_类))
{
object=PyEval\u CallObject(python\u类,args);
#或
//object=PyObject\u CallObject(python\u类,args);
//Py_DECREF(python_类);
}
其他的
{
cout事实证明(多亏了@),对象之所以
null
,是因为构造函数内部发生异常,从而导致对象为null。 异常的原因是路径格式错误和参数有问题(错误)。
基本上,我设置了如下参数:

automodel\u name=“r189”;
自动模型检查点路径=PyUnicode解码默认值(“L:\\test\u procs\\trained\u models\BEST\u checkpoint\u r189.tar”);
自动对齐\u fn=Py\u无;
自动img\u bank\u folder\u root=PyUnicode\u decodefsfdefault(“L:\\test\u procs\\data\\facebank\u 2”);
自动缓存\u文件夹=Py\u无;
自动后缀=Py_None;
自动重建缓存=Py\u False;
自动使用_jit=Py_False;
自动阈值=65;
自动设备=“cpu”;
这些论点是这样的:

auto args=Py\u BuildValue(“soooonnin”、模型名称、模型检查点路径、对齐\u fn、,
img\u bank\u folder\u root、cache\u folder、postfix、,
重建缓存,使用jit、阈值、设备);
这是错误的。 我把它们改成这样:

automodel\u name=“r189”;
自动模型检查点路径=“L:\\test\u procs\\trained\u models\BEST\u checkpoint\u r189.tar”;
自动对齐_fn=“”;
自动img\u bank\u folder\u root=“L:\\test\u procs\\data\\facebank\u 2”;
自动缓存_文件夹=”;
自动后缀=”;
自动重建\u缓存=0;
自动使用_jit=0;
自动阈值=65;
自动设备=“cpu”;
并简化了args,如下所示:

auto args=Py\u BuildValue(“SSSS IIIS”、模型名称、模型检查点路径、对齐\u fn、,
img\u bank\u folder\u root、cache\u folder、postfix、,
重建缓存,使用jit、阈值、设备);
在做了所有这些之后,我仍然面临着例外,并发现:
model\u checkpoint\u路径
需要一个固定路径,因为其路径中缺少一个
\

auto model\u checkpoint\u path=“L:\\test\u procs\\trained\u models\BEST\u checkpoint\u r189.tar”;
修复它:

auto model\u checkpoint\u path=“L:\\test\u procs\\trained\u models\\BEST\u checkpoint\u r189.tar”;
因此解决了所有问题。

事实证明(多亏了@),对象之所以为
null
,是因为构造函数内部发生异常,从而导致对象为null。 异常的原因是路径格式错误和参数有问题(错误)。
基本上,我设置了如下参数:

automodel\u name=“r189”;
自动模型检查点路径=PyUnicode解码默认值(“L:\\test\u procs\\trained\u models\BEST\u checkpoint\u r189.tar”);
自动对齐\u fn=Py\u无;
自动img\u bank\u folder\u root=PyUnicode\u decodefsfdefault(“L:\\test\u procs\\data\\facebank\u 2”);
自动缓存\u文件夹=Py\u无;
自动后缀=Py_None;
自动重建缓存=Py\u False;
自动使用_jit=Py_False;
自动阈值=65;
自动设备=“cpu”;
这些论点是这样的:

auto args=Py\u BuildValue(“soooonnin”、模型名称、模型检查点路径、对齐\u fn、,
img\u bank\u folder\u root、cache\u folder、postfix、,
重建缓存,使用jit、阈值、设备);
这是错误的。 我把它们改成这样:

automodel\u name=“r189”;
自动模型检查点路径=“L:\\test\u procs\\trained\u models\BEST\u checkpoint\u r189.tar”;
自动对齐_fn=“”;
自动img\u bank\u folder\u root=“L:\\test\u procs\\data\\facebank\u 2”;
自动缓存_文件夹=”;
自动后缀=”;
自动重建\u缓存=0;
自动使用_jit=0;
自动阈值=65;
自动设备=“cpu”;
并简化了args,如下所示:

auto args=Py\u BuildValue(“SSSS IIIS”、模型名称、模型检查点路径、对齐\u fn、,
img\u bank\u folder\u root、cache\u folder、postfix、,
重建缓存,使用jit、阈值、设备);
在做了所有这些之后,我仍然面临着例外,并发现:
model\u checkpoint\u路径
需要一个固定路径,因为其路径中缺少一个
\

auto model\u checkpoint\u path=“L:\\test\u procs\\trained\u models\BEST\u checkpoint\u r189.tar”;
修复它:

auto model\u checkpoint\u path=“L:\\test\u procs\\trained\u models\\BEST\u checkpoint\u r189.tar”;

这样就解决了所有问题。

我在你的代码中钻研了一点(并通过上一个问题中的一个进行了更多的钻研)。不确定这是否有用,但:返回一个借用的引用。因此,
Py_DECREF(python_类);
在我看来非常可疑。仅供参考:@Scheff谢谢,但使用它的代码片段没有被执行(它是从其他代码借用的,我忘了注释那部分)。我看了那个链接,它似乎使用了我也使用过的
PyObject\u CallObject
。这也返回了一个空对象。我同意
PyObject\u CallObject()module: 000001F7E07E8C28
size: 31
CONSTANT: THIS IS A TEST. REMOVE IT
FaceVerification: THIS IS A TEST. REMOVE IT
Image: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
Path: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
__builtins__: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
__cached__: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
__doc__: FV.F_V
__file__: C:\Users\Master\Anaconda3\Lib\site-packages\FV\F_V.py
__loader__: FV
__name__: FV.F_V
__package__: FV
__spec__: FV
__warningregistry__: THIS IS A TEST. REMOVE IT
align_face: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
cv2: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
data_transforms: THIS IS A TEST. REMOVE IT
get_central_face_attributes: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
math: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
nn: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
np: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
os: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
pickle: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
plt: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
resnet101: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
resnet18: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
resnet50: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
scipy: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
time: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
torch: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
tqdm: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc
transforms: C:\Users\Master\Anaconda3\Lib\site-packages\FV\__pycache__\F_V.cpython-36.pyc