Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.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
C++ C++;PyImport_C++_Python 2.7_Code Coverage_Coverage.py - Fatal编程技术网

C++ C++;PyImport

C++ C++;PyImport,c++,python-2.7,code-coverage,coverage.py,C++,Python 2.7,Code Coverage,Coverage.py,情况: 我正在尝试获取当前项目中所有python代码的覆盖率报告。我在很大程度上成功地利用了Coverage.py。目前,我使用它就像利用sitecustomize.py过程一样。对于从命令行开始的所有操作,它的工作非常出色 问题: 我不能让python模块从C++通过pyPurixIn()类型语句运行,以实际跟踪和输出覆盖数据。 示例: [test.cpp] 输出: 如果我手动运行test_mod.py,它会按预期输出。但是,如果我运行编译的test.cpp二进制文件,它不会输出任何覆盖率数据

情况:
我正在尝试获取当前项目中所有python代码的覆盖率报告。我在很大程度上成功地利用了Coverage.py。目前,我使用它就像利用sitecustomize.py过程一样。对于从命令行开始的所有操作,它的工作非常出色

问题:
我不能让python模块从C++通过pyPurixIn()类型语句运行,以实际跟踪和输出覆盖数据。 示例:

[test.cpp]

输出:
如果我手动运行test_mod.py,它会按预期输出。但是,如果我运行编译的test.cpp二进制文件,它不会输出任何覆盖率数据。我知道sitecustomize.py仍然受到攻击,因为我添加了一些调试以确保我不会发疯。我还可以在coverage debug日志中看到,它确实希望跟踪模块

[cov.log]

新进程:可执行文件:/usr/bin/python
新流程:cmd:???
新流程:父pid:69073
--配置----------------------------------------------------
_包括:无
_省略:无
尝试的配置文件:/tmp/.coveragerc
分支机构:是的
并发性:线程
多处理
配置文件:/tmp/.coveragerc
封面:假
数据文件:/tmp/python\u data/.coverage
调试:进程
追踪
系统
配置
来电者
数据操作
达蒂奥
禁用警告:-无-
排除列表:#\s*(pragma | pragma)[:\s]?\s*(no | no)\s*(cover | cover)
额外:无
0.0以下不合格
html_dir:htmlcov
html_标题:覆盖率报告
忽略错误:False
注:无
新增第1节第2页注:无
平行:对
部分始终列表:while(True | 1 | False | 0):
如果(真| 1 |假| 0):
部分列表:#\s*(pragma | pragma)[:\s]?\s*(no | no)\s*(branch | branch)
路径:{'source':['/tmp/python_source','/opt/test']}
插件_选项:{}
插件:-无-
精度:0
报告包括:无
报告省略:无
包括:无
run_省略:无
show_缺失:False
跳过:错误
来源:/opt/test/
胆小的:错
xml_输出:coverage.xml
xml_包_深度:99
--系统-------------------------------------------------------
版本:4.5.4
覆盖率:/usr/lib64/python2.7/site-packages/coverage/__-init___.pyc
覆盖路径:/usr/lib64/python2.7/site-packages/coverage
pylib_路径:/usr/lib64/python2.7
示踪物:PyTracer
plugins.file\u跟踪器:-无-
plugins.configurers:-无-
配置文件:/tmp/.coveragerc
配置读取:/tmp/.coveragerc
数据路径:/tmp/python\u data/.coverage
python:2.7.5(默认值,2019年6月11日,14:33:56)[GCC 4.8.5 20150623(Red Hat 4.8.5-39)]
平台:Linux-3.10.0-1062.el7.x86_64-x86_64-with-redhat-7.7-Maipo
实施:CPython
可执行文件:/usr/bin/python
cwd:/opt/test
路径:/usr/lib64/python27.zip
/usr/lib64/python2.7
/usr/lib64/python2.7/plat-linux2
/usr/lib64/python2.7/lib-tk
/usr/lib64/python2.7/lib-old
/usr/lib64/python2.7/lib-dynload
/usr/lib64/python2.7/site-packages
环境:COVERAGE_DEBUG=进程、跟踪、系统、配置、调用者、数据操作、数据IO
覆盖率\调试\文件=/tmp/cov.log
覆盖率\进程\启动=/tmp/.coveragerc
命令行:???
源匹配:/opt/测试
来源\包装\匹配:-无-
包括匹配:-无-
省略匹配:-无-
封面匹配:-无-
pylib_匹配:-无-
--结束-------------------------------------------------------
:/usr/lib64/python2.7/site.py@556
新的第1节第3页:/usr/lib64/python2.7/site.py@556
main:/usr/lib64/python2.7/site.py@539
addsitepackages:/usr/lib64/python2.7/site.py@317
addsitedir:/usr/lib64/python2.7/site.py@190
addpackage:/usr/lib64/python2.7/site.py@152
:  @1
进程启动:/usr/lib64/python2.7/site-packages/coverage/control.py@1289
开始:/usr/lib64/python2.7/site-packages/coverage/control.py@690
_init:/usr/lib64/python2.7/site-packages/coverage/control.py@362
_写入启动调试:/usr/lib64/python2.7/site-packages/coverage/control.py@382
写入格式化信息:/usr/lib64/python2.7/site-packages/coverage/debug.py@120
不跟踪“/usr/lib64/python2.7/threading.py”:位于--source树之外
:/usr/lib64/python2.7/site.py@556
main:/usr/lib64/python2.7/site.py@539
addsitepackages:/usr/lib64/python2.7/site.py@317
addsitedir:/usr/lib64/python2.7/site.py@190
addpackage:/usr/lib64/python2.7/site.py@152
:  @1
进程启动:/usr/lib64/python2.7/site-packages/coverage/control.py@1289
开始:/usr/lib64/python2.7/site-packages/coverage/control.py@701
开始:/usr/lib64/python2.7/site-packages/coverage/collector.py@318
settrace:/usr/lib64/python2.7/threading.py@99
_跟踪:/usr/lib64/python2.7/site-packages/coverage/pytracer.py@111
_应该跟踪:/usr/lib64/python2.7/site-packages/coverage/control.py@593
[…不跟踪一堆常见的python代码…]
跟踪“/test\u mod.py”
:。/测试_mod.py@3
_跟踪:/usr/lib64/python2.7/site-packages/coverage/pytracer.py@111
_应该跟踪:/usr/lib64/python2.7/site-packages/coverage/control.py@593
PyObject*PySys\u GetObject(char*name)返回借用的引用。引用计数不应该增加吗?那么:

// ...
PyObject* sysPath = PySys_GetObject("path");
Py_INCREF(sysPath);
PyList_Append(sysPath, PyString_FromString("."));
Py_DECREF(sysPath);
// sysPath = NULL;
// ...

我只是从Python-CAPI开始,但我的理解是,导入模块实际上并不会将它们添加到主模块中。你需要分开做。我不确定这是否有助于解决您的问题,但我的有效方法(减去错误检查)如下所示:

// Initialize main module
PyObject* mainModule = PyImport_AddModule("__main__");;

//  Initialize module to be added
PyObject* moduleNamePyObject= PyUnicode_DecodeFSDefault("moduleName");
PyImport_Import(moduleNamePyObject);

// Add module to main module
PyObject_SetAttrString(mainModulePtr, "moduleName", modulePyObject);

通常,在导入模块时,Python会尝试查找导入模块(包含import语句的模块)旁边的模块文件。Python然后尝试“sys.path”中的目录。通常不考虑当前工作目录。在我们的例子中,导入是通过API执行的,因此没有导入模块,Python可以在其目录中搜索“test_mod.py”。插件也不在“sys.path”上。使Python能够找到插件的一种方法是通过执行以下操作将当前工作目录添加到模块搜索路径?
New process: executable: /usr/bin/python
New process: cmd: ???
New process: parent pid: 69073
-- config ----------------------------------------------------
_include: None
_omit: None
attempted_config_files: /tmp/.coveragerc
branch: True
concurrency: thread
multiprocessing
config_files: /tmp/.coveragerc
cover_pylib: False
data_file: /tmp/python_data/.coverage
debug: process
trace
sys
config
callers
dataop
dataio
disable_warnings: -none-
exclude_list: #\s*(pragma|PRAGMA)[:\s]?\s*(no|NO)\s*(cover|COVER)
extra_css: None
fail_under: 0.0
html_dir: htmlcov
html_title: Coverage report
ignore_errors: False
note: None
New Section 1 Page 2note: None
parallel: True
partial_always_list: while (True|1|False|0):
if (True|1|False|0):
partial_list: #\s*(pragma|PRAGMA)[:\s]?\s*(no|NO)\s*(branch|BRANCH)
paths: {'source': ['/tmp/python_source', '/opt/test']}
plugin_options: {}
plugins: -none-
precision: 0
report_include: None
report_omit: None
run_include: None
run_omit: None
show_missing: False
skip_covered: False
source: /opt/test/
timid: False
xml_output: coverage.xml
xml_package_depth: 99
-- sys -------------------------------------------------------
version: 4.5.4
coverage: /usr/lib64/python2.7/site-packages/coverage/__init__.pyc
cover_paths: /usr/lib64/python2.7/site-packages/coverage
pylib_paths: /usr/lib64/python2.7
tracer: PyTracer
plugins.file_tracers: -none-
plugins.configurers: -none-
config_files: /tmp/.coveragerc
configs_read: /tmp/.coveragerc
data_path: /tmp/python_data/.coverage
python: 2.7.5 (default, Jun 11 2019, 14:33:56) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
platform: Linux-3.10.0-1062.el7.x86_64-x86_64-with-redhat-7.7-Maipo
implementation: CPython
executable: /usr/bin/python
cwd: /opt/test
path: /usr/lib64/python27.zip
/usr/lib64/python2.7
/usr/lib64/python2.7/plat-linux2
/usr/lib64/python2.7/lib-tk
/usr/lib64/python2.7/lib-old
/usr/lib64/python2.7/lib-dynload
/usr/lib64/python2.7/site-packages
environment: COVERAGE_DEBUG = process,trace,sys,config,callers,dataop,dataio
COVERAGE_DEBUG_FILE = /tmp/cov.log
COVERAGE_PROCESS_START = /tmp/.coveragerc
command_line: ???
source_match: /opt/test
source_pkgs_match: -none-
include_match: -none-
omit_match: -none-
cover_match: -none-
pylib_match: -none-
-- end -------------------------------------------------------
<module> : /usr/lib64/python2.7/site.py @556
New Section 1 Page 3<module> : /usr/lib64/python2.7/site.py @556
main : /usr/lib64/python2.7/site.py @539
addsitepackages : /usr/lib64/python2.7/site.py @317
addsitedir : /usr/lib64/python2.7/site.py @190
addpackage : /usr/lib64/python2.7/site.py @152
<module> : <string> @1
process_startup : /usr/lib64/python2.7/site-packages/coverage/control.py @1289
start : /usr/lib64/python2.7/site-packages/coverage/control.py @690
_init : /usr/lib64/python2.7/site-packages/coverage/control.py @362
_write_startup_debug : /usr/lib64/python2.7/site-packages/coverage/control.py @382
write_formatted_info : /usr/lib64/python2.7/site-packages/coverage/debug.py @120
Not tracing '/usr/lib64/python2.7/threading.py': falls outside the --source trees
<module> : /usr/lib64/python2.7/site.py @556
main : /usr/lib64/python2.7/site.py @539
addsitepackages : /usr/lib64/python2.7/site.py @317
addsitedir : /usr/lib64/python2.7/site.py @190
addpackage : /usr/lib64/python2.7/site.py @152
<module> : <string> @1
process_startup : /usr/lib64/python2.7/site-packages/coverage/control.py @1289
start : /usr/lib64/python2.7/site-packages/coverage/control.py @701
start : /usr/lib64/python2.7/site-packages/coverage/collector.py @318
settrace : /usr/lib64/python2.7/threading.py @99
_trace : /usr/lib64/python2.7/site-packages/coverage/pytracer.py @111
_should_trace : /usr/lib64/python2.7/site-packages/coverage/control.py @593


[... Not tracing a bunch of common python code ...]


Tracing './test_mod.py'
<module> : ./test_mod.py @3
_trace : /usr/lib64/python2.7/site-packages/coverage/pytracer.py @111
_should_trace : /usr/lib64/python2.7/site-packages/coverage/control.py @593
// ...
PyObject* sysPath = PySys_GetObject("path");
Py_INCREF(sysPath);
PyList_Append(sysPath, PyString_FromString("."));
Py_DECREF(sysPath);
// sysPath = NULL;
// ...
// Initialize main module
PyObject* mainModule = PyImport_AddModule("__main__");;

//  Initialize module to be added
PyObject* moduleNamePyObject= PyUnicode_DecodeFSDefault("moduleName");
PyImport_Import(moduleNamePyObject);

// Add module to main module
PyObject_SetAttrString(mainModulePtr, "moduleName", modulePyObject);
Py_Initialize();
PyObject* sysPath = PySys_GetObject((char*)"path");
PyObject* programName = PyString_FromString(<DIRECTORY>.c_str());
PyList_Append(sysPath, programName);
Py_DECREF(programName);
#include <stdio.h>
#include <iostream>
#include <Python.h>
int main()
{
    Py_Initialize();
    PyEval_InitThreads();
    PyObject* sysPath = PySys_GetObject("path");
    PyList_Append(sysPath, PyString_FromString("."));
    // Load the module
    PyObject *pName = PyString_FromString("test_mod");
    PyObject *pModule = PyImport_Import(pName);
    if (pModule != NULL) {
        std::cout << "Python module found\n";
        // Load all module level attributes as a dictionary
        PyObject *pDict = PyModule_GetDict(pModule);
        PyObject *pFunc = PyObject_GetAttrString(pModule, "getInteger");
        if(pFunc)
        {
            if(PyCallable_Check(pFunc))
            {
                PyObject *pValue = PyObject_CallObject(pFunc, NULL);
                std::cout << PyLong_AsLong(pValue) << std::endl;
            }
            else
            {
                printf("ERROR: function getInteger()\n");
            }

        }
        else
        {
            printf("ERROR: pFunc is NULL\n");
        }
    }
    else
        std::cout << "Python Module not found\n";
    Py_Finalize();
    return 0;