2

I'm creating an application using Python 3.4.3 and tkinter for a project as this is the language I am strongest and most fluent in. However, for the specification it would make much more sense for the end user to have a compiled application to run. Is there any way to either compile Python (pretty sure there isn't) or a way to get C++, or any other compiled language, to run a Python script? Quite a broad question (sorry) and any hints and tips would be useful.

4
  • 1
    Yes it's possible for a C++ program to call a python script. Easiest way would be to use popen(). See: stackoverflow.com/questions/16962430/…. Commented Nov 19, 2015 at 15:24
  • 1
    If the only goal is to make the python code into an executable you could use something like pyinstaller. Commented Nov 19, 2015 at 15:25
  • You can also embed Python interpreter if needed, look at the docs: docs.python.org/2/extending/embedding.html Commented Nov 19, 2015 at 15:28
  • Also one other thing you might consider is turning the problem on it's head: you can make your c++ code exposed as a python API using something like boost python. Commented Nov 19, 2015 at 15:57

3 Answers 3

3

My understanding is that what you want is to end with a single (Windows ?) executable that you could send to your end users to ease deployment.

It is possible (and easy) for scripts that only use a limited and know set of modules, there is even a nice tool on SourceForge dedicated to it: py2exe (following is extracted from tutorial).

You just prepare a setup.py script (when original script is trivially simple with a command line UI):

from distutils.core import setup
import py2exe

setup(console=['myscript.py'])

and run python setup.py py2exe

As soon as you are using a GUI and many modules, things can become harder, even if doc lets think that tkinter seems correctly processed.

Sign up to request clarification or add additional context in comments.

2 Comments

I'm sorry that this is just hints, but py2exe generally needs configuration and that configuration depends on what modules the python script uses.
Indeed pyinstaller or py2exe are very good ways to start; There's no C++ code to write, not sure if that's what OP is asking, but runtime can be accessed just as well.
2

What I've done in the past is to use the Python C API to load a Python module, call some methods, and convert values back into C types. See the documentation here: https://docs.python.org/3.4//c-api/index.html

I can't give detailed information here (read the docs), but here is a really basic example (I'm doing this off the top of my head, so there may be problems in my example, and it omits all error checking)

// first you would have to load the module
Py_Initialize();
PyObject *module = PyImport_ImportModule(module_name);

// you would want to do some error checking to make sure the module was actually loaded

// load the module dictionary
PyObject *module_dict = PyModule_GetDict(module);

// call the constructor to create an instance
PyObject *constructor = PyDict_GetItemString(module_dict, "ClassName");
PyObject *instance = PyObject_CallObject(constructor, NULL);
Py_DECREF(constructor);

// call a method that takes two integer arguments
PyObject *result = PyObject_CallMethod(instance, "method_name", "ii", 5, 10);

// let's pretend the result is an integer
long log_val = PyInt_AsLong(result)

Comments

1

I have used Nuitka and it really works like a charm. Nuitka translates python code to C++ and compile it, creating an executable. You can tell Nuitka what part of python code must be compiled: only your code, your code and some libraries, or everything, including linking with the python interpreter to get a stand alone executable.

Cython works great too (although I experimented some problema when using de super function in derived clases). In this case you need the interpreter.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.