Jump to content
Column

[C++] Creare extensii .pyd

Recommended Posts

Posted (edited)

As dori sa stiu cu ce IDE pot crea o extensie de python .pyd . Am facut o aplicatie in Visual C++ 2010 si o extensie insa dupa ce am instalat acea aplicatie in alt calculator imi dadea erori, imi spunea ca nu am .NET si alte lucruri care nu imi trebuiesc intr-un .dll . Am incercat si cu DEV C++ insa am vazut ca nu se compileaza...


#include <Python.h>

PyMethodDef MyProgramByColumn[] =
{
{0,0,0,0};
};

PyMODINIT_FUNC
initmyprogram(void)
{
PyObject *m;
m=Py_InitModule("myprogram", MyProgramByColumn);
if(m==NULL)
return;
}

Sunt la inceput si doresc sa lucrez cat mai mult in C/C++, daca am spus ceva banal nu doresc sa ma luati peste picior, ca va asigur ca voi nu stiti foarte multe!

Edited by Column
Posted (edited)

Zici ceva de extensie, dupa zici de un program in C++, nu prea inteleg nimic.

In legatura cu IDE, renunta la visual studio, dev c++ si instaleaza Code Blocks : Code :: Blocks



#include <iostream>

using namespace std;

int main()
{
int x,y,z;
cin>>x>>y;
z=x;
x=y;
y=z;
cout<<x<<" "<<y<<endl;
return 0;
}

Daca vrei sa afli mai multe informatii despre "using namespace std", uite aici : Name visibility - C++ Tutorials

PS: Renunta la formatari de genul bold, italic atunci cand scrii pe forum.

Edited by tjt
Posted

tjt, folosesc si CodeBlocks, DevC++, Visual Studio 2010 (include aici Visual Basic, Visual C++, etc), Borland etc. dar nici-un compilator nu-mi compileaza extensia .pyd . Mai mult decat atat, Visual C++ mi-l compileaza insa imi adauga bibliotecile alea .NET iar cand vrei sa-ti mearga programul pe alte sisteme de operare sau alte calculatoare ce nu au instalate framework-urile, trebuie sa le instalezi chiar daca tu in program nu le folosesti.. Daca intelegi ce vreau sa spun. Programul pus in PHP este doar asa de "design" nu are nicio legatura cu ce am zis:)) dar mersi de sfat... Mai astept pareri.

  • Active Members
Posted (edited)

As dori sa stiu cu ce IDE pot crea o extensie de python .pyd . Am facut o aplicatie in Visual C++ 2010 si o extensie insa dupa ce am instalat acea aplicatie in alt calculator imi dadea erori, imi spunea ca nu am .NET si alte lucruri care nu imi trebuiesc intr-un .dll . Am incercat si cu DEV C++ insa am vazut ca nu se compileaza...

Sunt la inceput si doresc sa lucrez cat mai mult in C/C++, daca am spus ceva banal nu doresc sa ma luati peste picior, ca va asigur ca voi nu stiti foarte multe!

Ai zis ca stii ce inseamna .pyd si cum sa le folosesti, insa eu nu cred asta, asa ca iti mai povestesc putin:

Fiserele cu extensia .pyc contin bytecode, adica "transformarea" din cod sursa in bytecode. Pe scurt, poti rula direct un program in Python fara a fi nevoie in prealabil de a creea un executabil pe care mai apoi sa il executi.

Mai mult, aceste fisiere .pyc maresc viteza de executie daca le ai prin preajma ( de obicei se gasesc cu acelasi nume ca si .py files )

Nu exista "un program" cu care sa creezi o extenie de python .pyd. Ai importat un modul in python, ti-a creeat .pyd-ul dupa care tanjesti si gata, done.

Ce legatura are aplicatia ta facuta in C++ cu .pyd-ul ? Ce vrei mai exact ? Un fisier .pyd contine pyObjects asa ca exceptand cazul exceptional in care poti folosi libraria BOOST in C++ pentru a creea ceva asemanator, habar nu am ce vrei sa faci.

Cat despre portabilitatea codului tau... cel mai usor e sa folosesti notepad++ si sa compilezi direc cu gcc. Astfel, va fi de 100 de ori mai usor sa scrii cod care mai apoi poate fii rulat pe toate distributiile.

Deci, tu ce vrei pana la urma ? Fii clar si concis.

Edited by MrGrj
Posted

MrGrj stiu ce inseamna fisierele .pyd, nu trebuie sa-mi dai exemple, iar la intrebare am fost destul de explicit dupa parerea mea. Eu vreau sa fac o extensie de python care sa interactioneze cu C++, mai exact vreau sa transmit niste date din C++ in python. O sa-ti dau un exemplu doar, daca incerci sa incluzi bibliotecile python-ului si fisierele din "include" in CodeBlocks, nu o sa ti le vada si desigur nu o sa le compile-ze, dar in Visual C++ merge sa le folosesti insa am spus, Visual C++ o sa-mi incarce si bibliotecile din .NET ceea ce ma enerveaza. Am uitat sa spun ca nu doresc sa folosesc "<BOOST-ul>" ci doar vreau sa fac declaratiile proprii si toate cele, daca intelegi. Eu o sa las un exemplu mic mai sus in descriere, iar tu incearca sa-l rulezi in CodeBlocks fara BOOST, iar daca iti merge te rog da-mi PM.

  • Active Members
Posted (edited)

Sa-mi bag pula in scrisul asta cu bold si in style-ul pus. Nu poti sa scrii normal ?

Daca nu vrei sa folosestii boost, mai stiu doar altele doua care isi fac treaba:

SWIG link

SIP link

O alta metoda ar fi sa faci toata treaba manual ( asa cum vrei tu ) folosind C API insa te avertizez ca e low-level si trebe' ceva cunostinte sa faci asta. Dar e bine ca asa mai inveti cum functioneaza Python in general ( si oricum tre' sa stii sa faci asta daca folosesti SWIG )

Edited by MrGrj
Posted (edited)

Mama ei de documentatie :P (scuze de tldr si unele greseli in avans)

Is a *.pyd file the same as a DLL?

Yes, .pyd files are dll’s, but there are a few differences. If you have a DLL named foo.pyd, then it must have a function initfoo(). You can then write Python “import foo”, and Python will search for foo.pyd (as well as foo.py, foo.pyc) and if it finds it, will attempt to call initfoo() to initialize it. You do not link your .exe with foo.lib, as that would cause Windows to require the DLL to be present.

Note that the search path for foo.pyd is PYTHONPATH, not the same as the path that Windows uses to search for foo.dll. Also, foo.pyd need not be present to run your program, whereas if you linked your program with a dll, the dll is required. Of course, foo.pyd is required if you want to say import foo. In a DLL, linkage is declared in the source code with __declspec(dllexport). In a .pyd, linkage is defined in a list of available functions.

Deci? Click dreapta -> Rename -> schimb .dll co .pyd Dar asta inseamna ca nu pot schimba numele fisierului deoarece python nu va mai gasii functia exportata gen [dllname]init().

Building C and C++ Extensions on Windows

Python/C API Reference Manual

Extending and Embedding the Python Interpreter

Extending/Embedding FAQ

Normal ca se plange de .NET si alte prostii pe restul platformelor si este si normal. Windows (si alte platforme) are anumite functii pe care programul tau si restul programelor din calculatorul tau le folosesc. Gen strcpy(), malloc(), printf() etc.

Si pentru a reduce marimea executabilului si memoria folosita de fiecare executabil la run-time sa decis pentru a implementa acele functii si utilitati intr-un dll comun. Pe care il vezi tot timpul sub numele Visual C++ Redistributable... in cerintele anumitor programe. Si daca tu ai compilat cu Visual Studio 2015 automat ai nevoie de Visual C++ Redistributable for Visual Studio 2015 si tot asa.

Daca vrei sa nu depinzi de bibliotecile comune din windows atunci le poti include static in executabilul tau. Avoiding the Visual C++ Redistributable Package (ultima optiune!)

Daca te decizi sa folosesti Code-Blocks si MinGW atunci recomand Code-Blocks versiunea faca compiler. Adica codeblocks-##.##-setup.exe Si inca o mica sugestie ar fi sa downloadezi si nightly builds de pe forum. Code-Blocks este distribuit foarte rar. De la ultima versiune si pana acum au fost sute de imbunatatiri. Recomand foarte mult! (doar downloadezi arhivele si le extragi in folderul Code-Blocks)

Urmatorul lucru ar fi MinGW dar nu orice MinGW. In nici un caz TDM-GCC. Asta daca nu vrei batai de cap cu unele biblioteci. Eu recomand MinGW-w64. Nu te lasa pacalit de nume. Functioneaza si pe 32bit.

Poti downloada manual archivele pentru x32 sau x64. Sau poti folosii installer-ul oferit.

Pentru x32: #.#.#/threads-posix/dwarf/i686-5.2.0-release-posix-dwarf-rt_v4-rev#.7z

Pentru x64: #.#.#/threads-posix/seh/x86_64-5.2.0-release-posix-seh-rt_v4-rev#.7z

Dupa care specifici unde sa-l gaseasca Code-Blocks. Pentru asta te duci la Settings > Compiler si introduci folderul si numele executabilelor respective.

settings.jpg

Acum daca ai instalat tot ce trebuie. Sa nu crezi ca MinGW nu are si el ce are si Visual Studio. Daca nu faci static linking atunci executabilul tau se va plange de libstdc++-6.dll, libwinpthread-1.dll, libgcc_s_dw2-1.dll etc.

Deci in proiectul tau deschis in Code-Blocks. Te duci la Project > Build Options (sau click dreapta pe el si > Build Options). Dupa care selectezi modulul tau preferat Release/Debug si introduci urmatoarele comezi.

La Compiler Settings > Other compiler options :

-static-libgcc
-static-libstdc++
-enable-static

compiler.jpg

La Linker Settings > Other linker options :

-static

linker.jpg

Atentie: Marimea executabilului tau va fi mai mare datorita includerii bibliotecilor standard in mode static. Sper ca nu trebuie sa explic de ce.

Acum poti compila executabilul tau faca a fi nevoie sa distribui nimic.

Edited by S.L.C

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...