Как вызвать функцию, хранящуюся в другом файле из программы Python? - PullRequest
4 голосов
/ 04 октября 2011

Если у меня есть текстовый файл, содержащий определение функции Python, как я могу сделать вызов функции из другой программы Python.Ps: функция будет определена в программе Python, которая выполняет вызов.

Способы, которые можно сделать:

  1. Рассмотрим функцию python как модуль и вызвать ее.Ограничение здесь заключается в том, что я должен преобразовать функцию Python голой в модуль, который будет выдавать ошибки.

  2. Вставьте код (код функции) в программу, которая вызывает функцию.

Какой лучший способ это сделать?

Редактировать: Спасибо за все ответы.Я пролил много света на первоначальное замешательство, которое у меня было.Еще одно сомнение - что, если человек (очевидно, не я) написал os.system ("rm -rf").И я заканчиваю тем, что выполняю это.Это означало бы конец света для меня, верно?

Edit2: Поскольку многие из вас просили меня использовать exec, я хотел бы указать на этот поток и, в частности, проблему пространства имен,Это дает пользователю много шансов «обойти» питона.Разве вы не думаете?

Ответы [ 5 ]

5 голосов
/ 04 октября 2011

Вы ищете ключевое слово exec .

>>> mycode = 'print "hello world"'
>>> exec mycode
Hello world

Итак, если вы читаете текстовый файл как текст (при условии, что он содержит только функцию), например:

test.txt:

def a():
    print "a()"

test.py:

mycode = open('test.txt').read()
exec mycode # this will execute the code in your textfile, thus define the a() function
a() # now you can call the function from your python file

Ссылка на документ: http://docs.python.org/reference/simple_stmts.html#grammar-token-exec%5Fstmt

Вы также можете посмотреть на оператор compile : здесь .

2 голосов
/ 04 октября 2011

Как, например, Reflection в Java? Если это так, в Python есть модуль с именем imp для его предоставления.

foo.py

def foo():
  return "return from function foo in file foo.py"

код где угодно

modes = imp.get_suffixes() #got modes Explained in link below
mode = modes[-2] # because I want load a py file
with open("foo.py") as file:
  m = imp.load_module("name", file, "foo.py", mode)
print(m.foo())

выше mode = modes[-2], потому что мой imp.get_suffixes():

>>> imp.get_suffixes()
[('.cpython-32m.so', 'rb', 3), ('module.cpython-32m.so', 'rb', 3), ('.abi3.so', 'rb', 3), ('module.abi3.so', 'rb', 3), ('.so', 'rb', 3), ('module.so', 'rb', 3), ('.py', 'U', 1), ('.pyc', 'rb', 2)]

вот мой вывод:

Python 3.2.1 (default, Aug 11 2011, 01:27:29) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import imp
>>> with open("foo.py") as file:
...   m = imp.load_module("foo", file, "foo.py", ('.py', 'U', 1))
... 
>>> m.foo()
'return from function foo in file foo.py'

Проверьте это здесь: http://docs.python.org/py3k/library/imp.html Оба Python 2.7 и Python 3 работает:

Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import imp
>>> imp.get_suffixes()
[('.so', 'rb', 3), ('module.so', 'rb', 3), ('.py', 'U', 1), ('.pyc', 'rb', 2)]
>>> with open("foo.py") as file:
...   m = imp.load_module("foo", file, "foo.py", ('.py', 'U', 1))
... 
>>> m.foo()
'return from function foo in file foo.py'
2 голосов
/ 04 октября 2011

compile () и eval () могут сделать трюк:

>>> code = compile('def foo(a): return a*2', '<string>', 'exec')
>>> eval(code)
>>> foo
52: <function foo at 0x01F65F70>
>>> foo(12)
53: 24

или с файлом:

with open(filename) as source:
    eval(compile(source.read(), filename, 'exec'))
1 голос
/ 04 октября 2011

Вы можете использовать execfile:

execfile("path/example.py")

# example.py
# def example_func():
#     return "Test"
#

print example_func()
# >Test

РЕДАКТИРОВАТЬ:

Если вы хотите выполнить какой-то небезопасный код, вы можете попробовать сделать его таким образом,хотя это, вероятно, не очень безопасно в любом случае:

def execfile_sandbox(filename):
    from copy import copy
    loc = globals()
    bi  = loc["__builtins__"]
    if not isinstance(bi, dict): bi = bi.__dict__ 

    bi = copy(bi)        
    # no files
    del bi["file"]    
    # and definitely, no import
    del bi["__import__"]
    # you can delete other builtin functions you want to deny access to

    new_locals = dict()
    new_locals["__builtins__"] = bi
    execfile(filename, new_locals, new_locals)

Использование:

try:
    execfile_sandbox("path/example.py")
except:
    # handle exception and errors here (like import error)
    pass
0 голосов
/ 04 октября 2011

Я не уверен, какова ваша цель, но я предполагаю, что у вас есть функция в одной программе, и вы хотите, чтобы эта функция выполнялась в другой программе.Вы можете «маршалировать» функцию с первого на второе.

Пример, первая программа:

# first program
def your_func():
    return "your function"

import marshal
marshal.dump(your_func.func_code, file("path/function.bin","w"))

Вторая программа:

# Second program

import marshal, types
code = marshal.load(file("path/function.bin"))
your_func = types.FunctionType(code, globals(), "your_func")

print your_func()
# >your function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...