Agent skill

Add Python Binding

by czyt1988 in czyt1988/data-workbench

A skill your agent uses when adding new Python bindings (exposing C++ classes/functions to Python) in the DAWorkBench project, or modifying existing bindings.

LGPL-3.0Auto-check passedData & Analytics

Install Add Python Binding

skills CLI
$ npx skills add czyt1988/data-workbench --skill add-python-binding -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install czyt1988/data-workbench add-python-binding --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/czyt1988/data-workbench.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/add-python-binding .claude/skills/add-python-binding && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
add-python-binding
GitHub stars
102
Token cost
~4.6k tokens
SKILL.md length
1,008 words
Files
2
Skills in repo
4
Repo updated
First seen
Licence
LGPL-3.0

At a glance

A skill your agent uses when adding new Python bindings (exposing C++ classes/functions to Python) in the DAWorkBench project, or modifying existing bindings.

  • Works in 5 steps: #include "DAPybind11InQt.h" as the first… → Define module with… → .def() for free functions → …
  • Adding new Python bindings (exposing C++ classes/functions to Python) in the DAWorkBench project
  • SKILL.md covers Overview, Decision Tree: What Are You…, !!!danger slots workaround… and Scenario A: Simple Function…, plus 7 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Add Python Binding is an agent skill from czyt1988/data-workbench. Use when adding new Python bindings (exposing C++ classes/functions to Python) in the DAWorkBench project, or modifying existing bindings. Trigger words: python binding, pybind11 binding, expose to python, add binding, export python module, bind C++ to Python.

Its SKILL.md is about 4.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `SKILL_cn.md`).

It sits in Data & Analytics. It works with Python and C++. The repository describes itself as: AI Agent-driven data analysis workbench built on C++17/Qt: directed-graph workflow engine, embedded Python (pandas/numpy), interactive publication-quality charts, C++ & Python… The licence is LGPL-3.0.

When your agent uses it

  • Adding new Python bindings (exposing C++ classes/functions to Python) in the DAWorkBench project
  • Modifying existing bindings
  • Words: python binding
  • Pybind11 binding

Example prompts

  • “/add-python-binding”

Requirements

  • Python 3

Workflow steps

5 steps, taken from the first numbered list in SKILL.md.

  1. #include "DAPybind11InQt.h" as the first pybind11-related header
  2. Define module with PYBIND11_EMBEDDED_MODULE(module_name, m)
  3. .def() for free functions
  4. Singleton returns must specify pybind11::return_value_policy::reference, otherwise pybind11 will try to destruct it
  5. Module names follow the da_xxx prefix convention

What it can do on your machine

Read from SKILL.md and the folder at commit cf3bbda. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are cpp).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Add Python Binding loads about 4.6k tokens when it runs. Until then it costs about 70 tokens; SKILL.md has 1,008 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~70
When it runs · the whole SKILL.md, loaded when a task matches
~4.6k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from czyt1988/data-workbench at commit cf3bbda, republished under its LGPL-3.0 licence (© czyt1988). 1,008 words, ~4,639 tokens.

Download SKILL.mdSave it as .claude/skills/add-python-binding/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
add-python-binding
description
Use when adding new Python bindings (exposing C++ classes/functions to Python) in the DAWorkBench project, or modifying existing bindings. Trigger words: python binding, pybind11 binding, expose to python, add binding, export python module, bind C++ to Python.

Add Python Binding

Overview

This skill guides adding Python bindings for C++ code in the DAWorkBench project. The project uses pybind11 embedded mode (PYBIND11_EMBEDDED_MODULE) to expose C++ classes and functions to the Python scripting environment. Bindings fall into four scenarios, each with distinct patterns and key points.

Decision Tree: What Are You Binding?

What are you binding?
├── A standalone free function or singleton accessor → Scenario A: Simple Function Binding
├── A Qt-interfacing class (with QString/QList etc. parameters) → Scenario B: Qt-Interfacing Class Binding
├── A data wrapper class (pandas/numpy object wrapper) → Scenario C: Data Wrapper Binding
└── C++ needs to call Python functions → Scenario D: Python Module Import

!!!danger slots workaround (First Step for All Scenarios)

Before including any pybind11 header, you must first include DAPybind11InQt.h. Qt's slots macro conflicts with pybind11. This header handles the #undef slots → include pybind11 → #define slots Q_SLOTS toggle.

cpp
#include "DAPybind11InQt.h"  // 必须是第一个pybind11相关头文件

Scenario A: Simple Function Binding

Use for: Standalone free functions, singleton accessors (no Qt type parameters).

Skeleton
cpp
// MyPythonBinding.h
#ifndef MYPYTHONBINDING_H
#define MYPYTHONBINDING_H
#include <string>
namespace DA {
void myHelperFunction(const std::string& msg);
DA::DACoreInterface* getMyCorePtr();
}
#endif

// MyPythonBinding.cpp
#include "MyPythonBinding.h"
#include "DAPybind11InQt.h"  // slots workaround,必须第一个
#include "DACoreInterface.h"

namespace DA {
void myHelperFunction(const std::string& msg) {
    qInfo() << QString::fromStdString(msg);
}
}

PYBIND11_EMBEDDED_MODULE(da_my_module, m)
{
    // 单例访问器:必须使用 return_value_policy::reference
    m.def("getCore",
          &DA::getMyCorePtr,
          "Return the core interface (singleton)",
          pybind11::return_value_policy::reference);

    // 自由函数:默认策略即可
    m.def("myHelper", &DA::myHelperFunction, "A helper function");
}
Key Steps
  1. #include "DAPybind11InQt.h" as the first pybind11-related header
  2. Define module with PYBIND11_EMBEDDED_MODULE(module_name, m)
  3. .def() for free functions
  4. Singleton returns must specify pybind11::return_value_policy::reference, otherwise pybind11 will try to destruct it
  5. Module names follow the da_xxx prefix convention

重要:所有返回裸指针 T* 的工厂方法(如 addHistogram、addCurve 等)也必须指定 return_value_policy::reference,否则 Python GC 会 delete 底层 C++ 对象。详见项目技能 pybind11-return-value-policy。

Reference Files
FilePurpose
src/APP/PythonBinding/DAAppPythonBinding.cppFull Scenario A example
src/APP/PythonBinding/DAAppPythonBinding.hFunction declaration template
src/DAPyBindQt/DAPybind11InQt.hslots workaround

Scenario B: Qt-Interfacing Class Binding

Use for: Interface classes with QString, QList, QJsonObject and other Qt type parameters.

Skeleton
cpp
#include "DAPybind11InQt.h"  // slots workaround,必须第一个
#include "DAPybind11QtCaster.hpp"  // Qt类型转换器
#include "DAPythonSignalHandler.h"
#include "MyQtInterface.h"

PYBIND11_EMBEDDED_MODULE(da_my_interface, m)
{
    // 1. 绑定类
    pybind11::class_<DA::MyQtInterface>(m, "MyQtInterface")
        // 2. QString参数 → lambda包装,用 std::string 接收再转换
        .def("showMessage",
             [](DA::MyQtInterface& self, const std::string& message, int timeout) {
                 self.showMessage(QString::fromStdString(message), timeout);
             },
             pybind11::arg("message"),
             pybind11::arg("timeout") = 15000)
        // 3. 返回内部对象 → reference_internal
        .def("getSubInterface",
             &DA::MyQtInterface::getSubInterface,
             pybind11::return_value_policy::reference_internal)
        // 4. QList<T>返回值 → lambda手动转为 pybind11::list
        .def("getAllItems",
             [](DA::MyQtInterface& self) {
                 QList<DA::MyItem> items = self.getAllItems();
                 pybind11::list pyList;
                 for (const DA::MyItem& item : items) {
                     pyList.append(item);
                 }
                 return pyList;
             },
             "Get all items as a Python list")
        // 5. JSON配置对话框(getConfigValues模式)
        .def("getConfigValues",
             [](DA::MyQtInterface& self, const std::string& jsonConfig, const std::string& cacheKey) {
                 QJsonObject jsonObj = self.getConfigValues(
                     QString::fromStdString(jsonConfig),
                     self.getMainWindow(),
                     QString::fromStdString(cacheKey));
                 return DA::PY::qjsonObjectToPyDict(jsonObj);
             },
             pybind11::arg("jsonConfig"),
             pybind11::arg("cacheKey") = "")
        ;

    // 6. 跨线程通信(如需从Python回调到Qt主线程)
    pybind11::class_<DA::DAPythonSignalHandler>(m, "DAPythonSignalHandler")
        .def(pybind11::init<>())
        .def("callInMainThread",
             [](DA::DAPythonSignalHandler& self, pybind11::function pyFunc) {
                 self.callInMainThread([pyFunc]() {
                     try {
                         pybind11::gil_scoped_acquire acquire;
                         pyFunc();
                     } catch (const pybind11::error_already_set& e) {
                         qCritical() << "Python error in main thread callback:" << e.what();
                     }
                 });
             },
             pybind11::arg("func"));
}
Key Steps
  1. #include "DAPybind11InQt.h" as the first pybind11-related header (!!!danger mandatory)
  2. #include "DAPybind11QtCaster.hpp" to bring in Qt type casters
  3. pybind11::class_<>() to bind the interface class
  4. QString parameters: lambda wrapper, receive std::string then convert with QString::fromStdString()
  5. Return internal objects: pybind11::return_value_policy::reference_internal (lifetime bound to parent object)
  6. QList<T> returns: lambda manually iterates and converts to pybind11::list (cannot rely on automatic QList caster)
  7. getConfigValues: std::string JSON → QString → dialog → QJsonObject → DA::PY::qjsonObjectToPyDict() to pybind11::dict
  8. Cross-thread callbacks: DAPythonSignalHandler::callInMainThread + pybind11::gil_scoped_acquire
Reference Files
FilePurpose
src/DAInterface/DAInterfacePythonBinding.cppFull Scenario B example
src/DAPyBindQt/DAPybind11QtCaster.hppQt type casters
src/DAPyBindQt/DAPythonSignalHandler.hCross-thread communication
src/DAPyBindQt/DAPyJsonCast.hQJsonObject ↔ pybind11::dict

Scenario C: Data Wrapper Binding

Use for: C++ classes that wrap pandas/numpy Python objects (e.g. DAData, DAPyDataFrame).

Skeleton
cpp
// MyDataPythonBinding.h — 推荐:写doxygen API参考
#ifndef MYDATAPYTHONBINDING_H
#define MYDATAPYTHONBINDING_H
/**
 * @file MyDataPythonBinding
 * @brief Python 绑定模块 da_my_data 的完整 API 清单与调用示例
 * 
 * @section py_overview 一、模块功能
 * da_my_data 模块把 C++ 的数据包装类暴露给 Python,使脚本能够:
 * - 直接读取/构造 pandas 对象并封装为 MyData;
 * - 将 MyData 加入管理器;
 * - 查询、删除等常规管理操作。
 * 
 * @section py_class_list 二、导出类型一览
 * | Python 类/枚举 | 对应 C++ 类型 | 说明 |
 * |----------------|---------------|------|
 * | MyData         | DA::MyData    | 轻量包装 |
 * | MyEnum         | DA::MyEnum    | 状态枚举 |
 * 
 * @section py_example 三、完整示例
 * @code{.py}
 * import pandas as pd
 * import da_my_data
 * df = pd.read_csv("example.csv")
 * data = da_my_data.MyData(df)
 * data.setName("csv_example")
 * @endcode
 */
#include "DAPybind11InQt.h"
#include "MyData.h"

DA::DAPyDataFrame pyDataFrameToDAPyDataFrame(pybind11::object df);
void addDataFrameFromPy(DA::MyDataManager& mgr, pybind11::object df, const std::string& name);
#endif

// MyDataPythonBinding.cpp
#include "MyDataPythonBinding.h"
#include "DAPybind11InQt.h"  // slots workaround
#include "MyData.h"

DA::DAPyDataFrame pyDataFrameToDAPyDataFrame(pybind11::object df)
{
    return DA::DAPyDataFrame(df);
}

void addDataFrameFromPy(DA::MyDataManager& mgr, pybind11::object df, const std::string& name)
{
    DA::DAPyDataFrame daDf = pyDataFrameToDAPyDataFrame(df);
    DA::MyData data(daDf);
    data.setName(QString::fromStdString(name));
    mgr.addData(data);
}

PYBIND11_EMBEDDED_MODULE(da_my_data, m)
{
    // 1. 绑定数据包装类
    pybind11::class_<DA::MyData>(m, "MyData")
        .def(pybind11::init<>())                    // 默认构造
        .def(pybind11::init<pybind11::object>())    // 直接接受 pandas 对象
        .def("toPyObject", &DA::MyData::toPyObject, "Return the underlying pandas object")
        .def("getName", [](const DA::MyData& self) { return self.getName().toStdString(); })
        .def("setName", [](DA::MyData& self, const std::string& n) { self.setName(QString::fromStdString(n)); })
        .def("isNull", &DA::MyData::isNull, "Check if the data is null")
        .def("id", &DA::MyData::id, "Return the data id");

    // 2. 导出枚举
    pybind11::enum_<DA::MyDataManager::ChangeType>(m, "DataChangeType")
        .value("Name", DA::MyDataManager::ChangeName)
        .value("Value", DA::MyDataManager::ChangeValue)
        .export_values();

    // 3. 绑定数据管理器
    pybind11::class_<DA::MyDataManager>(m, "MyDataManager")
        .def("addDataFrame", &addDataFrameFromPy, "Add a pandas DataFrame to manager")
        .def("addData",
             static_cast<void(DA::MyDataManager::*)(DA::MyData&)>(&DA::MyDataManager::addData),
             "Add a MyData object to manager")
        .def("getDataCount", &DA::MyDataManager::getDataCount)
        // QList → pybind11::list 手动转换
        .def("getAllDatas",
             [](DA::MyDataManager& self) {
                 QList<DA::MyData> datas = self.getAllDatas();
                 pybind11::list pyList;
                 for (const DA::MyData& data : datas) { pyList.append(data); }
                 return pyList;
             });
}
Key Steps
  1. #include "DAPybind11InQt.h" as the first pybind11-related header
  2. pybind11::init<pybind11::object>() constructor accepts pandas objects
  3. QString properties: lambda wrapper with std::string ↔ QString conversion
  4. pybind11::enum_<>() + .value() + .export_values() to export enums
  5. QList<T> returns: lambda manually converts to pybind11::list
  6. Overloaded functions: use static_cast<function_signature>(&Class::method) to select the correct overload
  7. Recommended: Write a complete doxygen API reference in the .h file (type table + construction notes + member docs + examples + limitations)
Reference Files
FilePurpose
src/DAData/DADataPythonBinding.cppFull Scenario C example
src/DAData/DADataPythonBinding.h.h doxygen API reference example (143 lines, best practice)

Scenario D: Python Module Import

Use for: C++ needs to call Python functions (e.g. numpy/pandas APIs), not exposing C++ to Python.

Skeleton
cpp
// DAPyModuleMyLib.h
#ifndef DAPYMODULEMYLIB_H
#define DAPYMODULEMYLIB_H
#include "DAPyBindQtGlobal.h"
#include "DAPyModule.h"
namespace DA {
class DAPYBINDQT_API DAPyModuleMyLib : public DAPyModule
{
    DA_DECLARE_PRIVATE(DAPyModuleMyLib)
    DAPyModuleMyLib();
public:
    ~DAPyModuleMyLib();
    static DAPyModuleMyLib& getInstance();
    void finalize();
    bool import();
    // 暴露缓存好的Python函数/类型
    bool isInstanceMyType(const pybind11::object& obj) const;
private:
    // PrivateData 中缓存 Python 对象引用
};
}  // namespace DA
#endif

// DAPyModuleMyLib.cpp
#include "DAPyModuleMyLib.h"
#include "DAPybind11InQt.h"  // slots workaround
#include <QDebug>

namespace DA {
class DAPyModuleMyLib::PrivateData
{
    DA_DECLARE_PUBLIC(DAPyModuleMyLib)
public:
    PrivateData(DAPyModuleMyLib* p);
    QString mLastErrorString;
    // 缓存 Python 函数/类型引用,避免每次 attr() 查找
    pybind11::object mObjMyType;
    pybind11::object mObjMyFunc;
};

DAPyModuleMyLib::PrivateData::PrivateData(DAPyModuleMyLib* p) : q_ptr(p) {}

DAPyModuleMyLib::DAPyModuleMyLib() : DAPyModule(), DA_PIMPL_CONSTRUCT
{
    import();  // 1. 先导入模块
    try {
        // 2. 惰性缓存关键 Python 对象
        d_ptr->mObjMyType = attr("MyType");
        d_ptr->mObjMyFunc = attr("my_function");
    } catch (const std::exception& e) {
        d_ptr->mLastErrorString = e.what();
    }
}

bool DAPyModuleMyLib::import()
{
    return DAPyModule::import("my_lib");  // 3. 调用基类 importModule
}

bool DAPyModuleMyLib::isInstanceMyType(const pybind11::object& obj) const
{
    return pybind11::isinstance(obj, d_ptr->mObjMyType);
}

DAPyModuleMyLib& DAPyModuleMyLib::getInstance()
{
    static DAPyModuleMyLib s_instance;
    return s_instance;
}
}
Key Steps
  1. Inherit DAPyModule (which inherits DAPyObjectWrapper, not QObject)
  2. Use PIMPL pattern (DA_DECLARE_PRIVATE / DA_PIMPL_CONSTRUCT)
  3. Call import() in constructor → DAPyModule::import("module_name") to import the Python module
  4. Use attr("name") to get Python object references, cache them in PrivateData (avoids repeated lookup overhead)
  5. Use pybind11::isinstance(obj, cached_type) for type checking
  6. Singleton pattern: getInstance() returns a static instance
Reference Files
FilePurpose
src/DAPyBindQt/numpy/DAPyModuleNumpy.hScenario D header template
src/DAPyBindQt/numpy/DAPyModuleNumpy.cppScenario D full implementation example
src/DAPyBindQt/DAPyModule.hDAPyModule base class API

Key Differences

AspectScenario AScenario BScenario CScenario D
Base patternPYBIND11_EMBEDDED_MODULE + .def()PYBIND11_EMBEDDED_MODULE + class_<>()PYBIND11_EMBEDDED_MODULE + class_<>() + enum_<>()Inherit DAPyModule, no PYBIND11_EMBEDDED_MODULE
Qt type handlingNone (pure std::string)Lambda wrapping QString / manual QList conversionLambda wrapping QStringNone (C++ calls Python, no Qt types exposed)
Ownership policyreference (singleton)reference_internal (child bound to parent lifetime)Default (wrapper manages itself)N/A (C++ side holds pybind11::object)
Enum exportNot applicableNot applicablepybind11::enum_<>() + .export_values()Not applicable
.h doxygen API referenceConcise function declarationsCan be omitted (see DAInterfacePythonBinding.h, only 4 lines)Recommended (see DADataPythonBinding.h, 143 lines)Not applicable (PIMPL class)
Stub updateAdd da_my_module.pyiAdd da_my_interface.pyiAdd da_my_data.pyiNot applicable
Show full SKILL.md (395 more words)Show less

Post-Binding Checklist

After adding a new Python binding module, these files must be updated synchronously:

  • ✅ stubs/ — Add a .pyi file following existing stub format (Chinese docstring + type annotations + cross-module imports). Watch for circular import edge cases: if the new module is referenced by da_interface, update da_interface/__init__.pyi imports too
  • ✅ stubs/mock/ — Add a mock .py file following existing mock format. Note lazy-loading pattern: see stubs/mock/da_interface.py for avoiding circular dependencies
  • ✅ docs/zh/dev-guide/python-binding/index.md — Update section 9 roadmap table, add row for the new module
  • ✅ docs/zh/dev-guide/python-binding/embedded-python-debugging.md — Update section 2 module overview table, add row for the new module
  • ✅ CMakeLists.txt — Add new binding files unconditionally (Python is mandatory; do not wrap them in any conditional CMake block)
  • ✅ mkdocs.yml — If navigation structure needs updating (new module docs page)

Compatibility Notes

Qt5 / Qt6
  • slots workaround: DAPybind11InQt.h handles #undef slots → include pybind11 → #define slots Q_SLOTS. All binding files must include this header first
  • QVector only exists in Qt5; in Qt6 QVector = QList. Use version-check macros if needed
  • QButtonGroup::buttonClicked in Qt5 uses QOverload<int>::of(), Qt6 uses idClicked
Unconditional Compilation

Python is a mandatory dependency and is always built. Binding code must not be wrapped in any conditional compilation guards or #ifdef macros. In CMakeLists.txt, add binding files unconditionally — there is no conditional CMake block that gates Python.

PIMPL Classes

Only bind public methods. Never attempt to bind DA_D pointers or PrivateData members. PIMPL private data must not be exposed to Python.

QwtPlotItem Subclasses

QwtPlotItem-related classes do not inherit QObject, so Q_OBJECT macro is not allowed. Do not use dynamic properties when binding them.

QList<BoundType>

Requires lambda manual conversion to pybind11::list (iterate and append each item). Cannot rely on automatic QList caster because bound types may not have registered one.

QVariant caster

DAPybind11QtCaster.hpp provides a QVariant caster supporting numpy object conversion, but not all Qt type combinations can serve as QHash keys.

Reference Files

FilePathPurpose
DAAppPythonBinding.cppsrc/APP/PythonBinding/Scenario A reference
DAAppPythonBinding.hsrc/APP/PythonBinding/Scenario A function declaration template
DAInterfacePythonBinding.cppsrc/DAInterface/Scenario B reference (Qt-interfacing class + lambda wrapping + QList conversion)
DADataPythonBinding.cppsrc/DAData/Scenario C reference (data wrapper class + enum export)
DADataPythonBinding.hsrc/DAData/.h doxygen API reference example (143 lines)
DAPyModuleNumpy.h/.cppsrc/DAPyBindQt/numpy/Scenario D reference (module import + lazy caching)
DAPyModule.hsrc/DAPyBindQt/DAPyModule base class API
DAPybind11InQt.hsrc/DAPyBindQt/slots workaround (mandatory for all scenarios)
DAPybind11QtCaster.hppsrc/DAPyBindQt/Qt type casters
DAPyInterpreter.hsrc/DAPyBindQt/Python interpreter management
DAPythonSignalHandler.hsrc/DAPyBindQt/Cross-thread communication
stubs/da_interface/init.pyistubs/da_interface/Stub format reference
stubs/mock/da_interface.pystubs/mock/Mock format reference (lazy-loading pattern)

© czyt1988, LGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file in skills/add-python-binding of czyt1988/data-workbench.

  • SKILL.md
  • SKILL_cn.md

Open the folder on GitHubat commit cf3bbda

Compare with similar skills

Add Python Binding next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Add Python Binding compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Add Python Binding this skillczyt1988/data-workbench102—~4.6kAutomated safety check: PassLGPL-3.0
Smooth Cpp Sharedopenforecast-org/smooth107—~1.1kAutomated safety check: PassLGPL-2.1
Elodin DBelodin-sys/elodin547—~2.8kAutomated safety check: PassApache-2.0
GeomasterLeonChaoX/qinyan-academic-skills9381 repos~2.9kAutomated safety check: PassMIT
Geomasteragent-skills-hub/agent-skills-hub1111 repos~5.2kAutomated safety check: PassMIT
GeomasterK-Dense-AI/scientific-agent-skills48k1 repos~2.8kAutomated safety check: PassMIT

Similar skills

  • Smooth Cpp Shared

    openforecast-org/smooth

    Work on the C++ layer that the R package and the Python port share — the headers under src/headers/, the Rcpp bindings in src/, the pybind11 bindings in src/python/, and the two build systems that…

    107 GitHub stars~1.1k tokensUpdated today
    Data & AnalyticsAuto-check passed
  • Elodin DB

    elodin-sys/elodin

    Work with Elodin-DB, the time-series telemetry database. An agent skill from elodin-sys/elodin.

    547 GitHub stars~2.8k tokensUpdated today
    Data & AnalyticsAuto-check passed
  • Geomaster

    LeonChaoX/qinyan-academic-skills

    Comprehensive geospatial science skill covering remote sensing, GIS, spatial analysis, machine learning for earth observation, and 30+ scientific domains.

    938 GitHub starsUsed in 1 repo~2.9k tokens
    Data & AnalyticsAuto-check passed
  • Geomaster

    agent-skills-hub/agent-skills-hub

    Comprehensive geospatial science skill covering remote sensing, GIS, spatial analysis, machine learning for earth observation, and 30+ scientific domains.

    111 GitHub starsUsed in 1 repo~5.2k tokens
    Data & AnalyticsAuto-check passed
  • Geomaster

    K-Dense-AI/scientific-agent-skills

    Supports geospatial research workflows for remote sensing, vector and raster GIS, spatial statistics, terrain and network analysis, and machine learning for Earth observation.

    48k GitHub starsUsed in 1 repo~2.8k tokens
    Data & AnalyticsAuto-check passed
  • Develops data processing pipelines, integrations, and machine learning scenarios in SAP Data Intelligence Cloud.

    462 GitHub stars~3.2k tokensUpdated 2 days ago
    Data & AnalyticsAuto-check passed

More from czyt1988/data-workbench

  • Create Setting Panel

    czyt1988/data-workbench

    A skill your agent uses when creating property panels or configuration UI in the data-workbench Qt/C++ project.

    102 GitHub stars~3.2k tokensUpdated 25 days ago
    Auto-check passed
  • Create Cpp Plugin

    czyt1988/data-workbench

    A skill your agent uses when creating a new C++ plugin DLL for the data-workbench platform, or modifying an existing plugin's structure, CMake, UI integration, or data access.

    102 GitHub stars~5.5k tokensUpdated 25 days ago
    Auto-check passed
  • Python Script Integration

    czyt1988/data-workbench

    A skill your agent uses when integrating Python scripts with C++ in a DAWorkbench plugin — calling Python from C++, Python multithreading without UI conflicts, Python-to-C++ data exchange, Python UI…

    102 GitHub stars~5.5k tokensUpdated 25 days ago
    Auto-check passed

Works with

Questions about Add Python Binding

What does Add Python Binding do?

A skill your agent uses when adding new Python bindings (exposing C++ classes/functions to Python) in the DAWorkBench project, or modifying existing bindings. Add Python Binding is an agent skill from czyt1988/data-workbench. Use when adding new Python bindings (exposing C++ classes/functions to Python) in the DAWorkBench project, or modifying existing bindings.

When should I use Add Python Binding?

Add Python Binding fits situations like: adding new Python bindings (exposing C++ classes/functions to Python) in the DAWorkBench project; modifying existing bindings; words: python binding; pybind11 binding.

How do I install Add Python Binding in Claude Code?

Run `npx skills add czyt1988/data-workbench --skill add-python-binding -a claude-code`. Or copy the skill folder (skills/add-python-binding in czyt1988/data-workbench) into .claude/skills/add-python-binding in your project. Claude Code loads it when a task matches its description.

How do I install Add Python Binding in Codex?

Run `npx skills add czyt1988/data-workbench --skill add-python-binding -a codex`. Or copy the skill folder (skills/add-python-binding in czyt1988/data-workbench) into .agents/skills/add-python-binding in your project. Codex loads it when a task matches its description.

Can I use Add Python Binding in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add czyt1988/data-workbench --skill add-python-binding -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/add-python-binding, .gemini/skills/add-python-binding, .github/skills/add-python-binding and .opencode/skills/add-python-binding in your project.

What does Add Python Binding need to run?

SKILL.md names no scripts, command-line tools or credentials: Add Python Binding is instructions for the agent only. Our summary lists: Python 3.

Does Add Python Binding access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Add Python Binding safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Add Python Binding use?

Add Python Binding is published under the LGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Add Python Binding use?

About 4.6k tokens (SKILL.md is roughly 19k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Add Python Binding?

Skills that share tags, products or a category with Add Python Binding: Smooth Cpp Shared (openforecast-org/smooth, 107 stars), Elodin DB (elodin-sys/elodin, 547 stars), Geomaster (LeonChaoX/qinyan-academic-skills, 938 stars) and Geomaster (agent-skills-hub/agent-skills-hub, 111 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Add Python Binding?

czyt1988 (a GitHub user) maintains it in czyt1988/data-workbench, which has 102 GitHub stars. The repository holds 4 skills in this directory. The repository was last updated on September 12, 2026.

Source: czyt1988/data-workbench on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.