Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在扩展中使用PyModule\u AddIntConstant()_Python_C_Python 3.x_Python C Api - Fatal编程技术网

Python 在扩展中使用PyModule\u AddIntConstant()

Python 在扩展中使用PyModule\u AddIntConstant(),python,c,python-3.x,python-c-api,Python,C,Python 3.x,Python C Api,我已经看到并试图重现这种效果: #include <Python.h> #include <Windows.h> static PyObject * sys_shutdown(PyObject *self, PyObject *args) { int val; if (!PyArg_ParseTuple(args, "i", &val)) val = SHTDN_REASON_MINOR_OTHER; // Provide fa

我已经看到并试图重现这种效果:

#include <Python.h>
#include <Windows.h>

static PyObject * sys_shutdown(PyObject *self, PyObject *args) {
    int val;

    if (!PyArg_ParseTuple(args, "i", &val))
        val = SHTDN_REASON_MINOR_OTHER; // Provide failsafe

    ExitWindowsEx(EWX_POWEROFF, val); // Shutdown
    return Py_BuildValue("");
}

static PyObject * sys_restart(PyObject *self, PyObject *args) {
    int val;

    if (!PyArg_ParseTuple(args, "i", &val))
        val = SHTDN_REASON_MINOR_OTHER; // Provide failsafe
    ExitWindowsEx(EWX_REBOOT, val); // Restart
    return Py_BuildValue("");
}

static PyObject * sys_log_out(PyObject *self, PyObject *args) {
    int val;

    if (!PyArg_ParseTuple(args, "i", &val))
        val = SHTDN_REASON_MINOR_OTHER; // Provide failsafe

    ExitWindowsEx(EWX_LOGOFF, val); // Log out
    return Py_BuildValue("");
}

static PyMethodDef localMethods[] = {
    {"shutdown", (PyCFunction)sys_shutdown, METH_VARARGS, "..."},
    {"restart", (PyCFunction)sys_restart, METH_VARARGS, "..."},
    {"log_out", (PyCFunction)sys_log_out, METH_VARARGS, "..."},
    {NULL, NULL, 0, NULL}
};

static struct PyModuleDef func = {
    PyModuleDef_HEAD_INIT,
    "utilities",
    "...",
    -1,
    localMethods,
};

PyMODINIT_FUNC PyInit_utilities(void) {
    PyObject *value;

    value = PyModule_New(&func);

    PyModule_AddIntConstant(value, "DEFINED", AF_INET);

    return PyModule_Create(&func);
}
所有内容均按预期生成,但我无法在扩展中使用
定义的

import utilities
for i in utilities.__dict__: print(i)
utilities.DEFINED # AttributeError: module 'utilities' has no attribute 'DEFINED'
返回:

__name__
__doc__
__package__
__loader__
__spec__
shutdown
restart
log_out
__file__
我想返回
如下:

return PyModule_Create(&value);
但结果是:

链接:致命错误LNK1104:无法打开文件“build\lib.win32-3.6\WinUtils.cp36-win32.pyd” 错误:命令“C:\Program Files(x86)\Microsoft Visual Studio\2017\WDExpress\VC\Tools\MSVC\14.14.26428\bin\HostX86\x86\link.exe”失败,退出状态为1104

如何将
DEFINED
值添加到扩展名中(以便运行
utilities.DEFINED

编辑:


如下面的回答所述,关闭所有内容并再次尝试成功构建扩展,但是使用
返回PyModule_Create(&value)仍然崩溃。

PyModule\u AddIntConstant(值,“已定义”,已定义值)
是正确的(假设
定义的_值
是(C)
长的

再加上最后的链接器错误(以及您正在编写代码然后进行测试等等),这告诉我链接器无法编写新的.pyd文件(包含最新的更改-包括
定义的
变量),因为之前启动的python.exe进程正在使用它,该进程导入了您的模块

  • 关闭导入模块的每个运行解释器(以“解锁”WinUtils.cp36-win32.pyd)
  • 构建(这一次,链接器将能够覆盖该文件)
  • 测试(运行Python代码)
注意:您可以检查函数返回值()

@EDIT0(关于第二个问题):

正如我在我的一条评论中指定的,使用
PyModule\u Create
(根据,您将获得未定义的行为):


PyModule\u AddIntConstant(值,“已定义”,已定义的值)
是正确的(假设
定义的_值
是(C)
长的

再加上最后的链接器错误(以及您正在编写代码然后进行测试等等),这告诉我链接器无法编写新的.pyd文件(包含最新的更改-包括
定义的
变量),因为之前启动的python.exe进程正在使用它,该进程导入了您的模块

  • 关闭导入模块的每个运行解释器(以“解锁”WinUtils.cp36-win32.pyd)
  • 构建(这一次,链接器将能够覆盖该文件)
  • 测试(运行Python代码)
注意:您可以检查函数返回值()

@EDIT0(关于第二个问题):

正如我在我的一条评论中指定的,使用
PyModule\u Create
(根据,您将获得未定义的行为):


您是对的,它构建了代码,但解释器仍然崩溃。我将编辑我的帖子,使其更具可复制性。所谓“崩溃”是指
namererror
?不是。我的意思是解释器会立即打开并关闭(我添加了
input()
,因此我知道出了问题)。如果我在空闲状态下运行它,
Shell
将出现。不幸的是,没有错误。而且只有当您访问定义的
时才会出现错误?也可以尝试其他成员(
重新启动
)。无论如何,
PyModule\u New
PyModule\u Create
不会;我觉得这不对。尝试
返回值(并初始化它
value=PyModule_Create(&func);
)。应该是这样的。注意实用程序和实用程序(包括在setup.py中)。一切都应该匹配。另外,
spammethods
应该以
{NULL,NULL,0,NULL}
结尾。但无论如何,我很困惑,在这个问题上有一些代码是有效的。发布问题后不要更改它(或者如果您确实相应地修改了问题)。您是正确的,它生成了代码,但解释器仍然崩溃。我将编辑我的帖子,使其更具可复制性。所谓“崩溃”是指
namererror
?不是。我的意思是解释器会立即打开并关闭(我添加了
input()
,因此我知道出了问题)。如果我在空闲状态下运行它,
Shell
将出现。不幸的是,没有错误。而且只有当您访问定义的
时才会出现错误?也可以尝试其他成员(
重新启动
)。无论如何,
PyModule\u New
PyModule\u Create
不会;我觉得这不对。尝试
返回值(并初始化它
value=PyModule_Create(&func);
)。应该是这样的。注意实用程序和实用程序(包括在setup.py中)。一切都应该匹配。另外,
spammethods
应该以
{NULL,NULL,0,NULL}
结尾。但无论如何,我很困惑,在这个问题上有一些代码是有效的。发布问题后不要更改它(或者如果您确实相应地修改了问题)。
return PyModule_Create(&value);
PyMODINIT_FUNC PyInit_utilities() {
    PyObject *mod = PyModule_Create(&func);
    PyModule_AddIntConstant(mod, "DEFINED", AF_INET);
    return mod;
}