Looking for a way to include Pyhtho scripting INSIDE a python program

J

John Antypas

Hello all,

I'm writing in tool in Python that manipulates various data objects read
from various streams. I wanted to give the user a chance to do advanced
work that could not easily be done from a GUI.

At first, I tried putting in a lightweight scripting language, and then
I thought, why not include Python in itself -- it is certainly powerful
enough.

I had assumed I'd present the user with a text window in which they
could type arbitrary python code. I'd wrap that code around a function
and pass that function a call of objects they could manipulate by
calling the methods of that class.

1. How can a python program invoke ANOTHER interpreter?
2. How can I pass the class in as its argument and get the modified
class back?

I know I can do something very ugly -- call a C method that calls a new
python interpreter but that seems VERY ugly.

Help?

Thanks.
 
B

Bryon

Hello all,

I'm writing in tool in Python that manipulates various data objects read
from various streams. I wanted to give the user a chance to do advanced
work that could not easily be done from a GUI.

At first, I tried putting in a lightweight scripting language, and then
I thought, why not include Python in itself -- it is certainly powerful
enough.

I had assumed I'd present the user with a text window in which they
could type arbitrary python code. I'd wrap that code around a function
and pass that function a call of objects they could manipulate by
calling the methods of that class.

1. How can a python program invoke ANOTHER interpreter?
2. How can I pass the class in as its argument and get the modified
class back?

I know I can do something very ugly -- call a C method that calls a new
python interpreter but that seems VERY ugly.

Help?

Thanks.

I'm very new to python but I think this is what you're looking for

http://pydoc.org/2.5.1/__builtin__.html#-compile
 
P

Paddy

Hello all,

I'm writing in tool in Python that manipulates various data objects read
from various streams. I wanted to give the user a chance to do advanced
work that could not easily be done from a GUI.

At first, I tried putting in a lightweight scripting language, and then
I thought, why not include Python in itself -- it is certainly powerful
enough.

I had assumed I'd present the user with a text window in which they
could type arbitrary python code. I'd wrap that code around a function
and pass that function a call of objects they could manipulate by
calling the methods of that class.

1. How can a python program invoke ANOTHER interpreter?
2. How can I pass the class in as its argument and get the modified
class back?

I know I can do something very ugly -- call a C method that calls a new
python interpreter but that seems VERY ugly.

Help?

Thanks.

You might try ipython at http://ipython.scipy.org/moin/; or 'python -
i'; or the exec and eval statements.

There is also the compiler module: http://docs.python.org/lib/compiler.html


- Paddy.
 
I

Ivan Illarionov

Hello all,

I'm writing in tool in Python that manipulates various data objects read
from various streams. I wanted to give the user a chance to do advanced
work that could not easily be done from a GUI.

At first, I tried putting in a lightweight scripting language, and then
I thought, why not include Python in itself -- it is certainly powerful
enough.

I had assumed I'd present the user with a text window in which they
could type arbitrary python code. I'd wrap that code around a function
and pass that function a call of objects they could manipulate by
calling the methods of that class.

1. How can a python program invoke ANOTHER interpreter?
2. How can I pass the class in as its argument and get the modified
class back?

I know I can do something very ugly -- call a C method that calls a new
python interpreter but that seems VERY ugly.

Help?

Thanks.

You don't need to envoke another interpreter.
Python can interpret arbitrary python code with exec statement.
Wrap user's string inside function definition, and exec it.

You might want to disable words like `import`, `exec` and `eval` in
user's code because it's a big security risk.
 
B

Bryan Oakley

Ivan said:
You don't need to envoke another interpreter.
Python can interpret arbitrary python code with exec statement.
Wrap user's string inside function definition, and exec it.

You might want to disable words like `import`, `exec` and `eval` in
user's code because it's a big security risk.

The above statement is exactly why one would want to eval the code
inside a separate interpreter. Not just for security, but to prevent
user code from stomping all over the application code by creating or
destroying global resources.

Is it possible to create a nested interpreter like you can do in some
other languages?
 
I

Ivan Illarionov

The above statement is exactly why one would want to eval the code
inside a separate interpreter. Not just for security, but to prevent
user code from stomping all over the application code by creating or
destroying global resources.

Is it possible to create a nested interpreter like you can do in some
other languages?

Yes. Call PyRun_SimpleString from ctypes or call PyRun_SimpleString
from custom python extension. But it does nothing what exec can't do.



We have:

exec `something` in `where_we_exec`



if `where_we_exec` is an empty dictionary the exec'd code has no
access to app code or global resources.



Even more, it's harder to control the nested interpreter than strings
about to be exec'd. And you still have to worry about security. So,
not only you gain nothing by this approach, you make your software
more vulnerable. The code like `import os\n os.*killme*` or
eval("__import__('os').*killme*") will be harder to disable.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,969
Messages
2,570,161
Members
46,705
Latest member
Stefkari24

Latest Threads

Top