2011-10-04 67 views
3

如果我有一個包含python函數定義的文本文件,如何從另一個Python程序進行函數調用。 Ps:該函數將在執行調用的Python程序中定義。如何從Python程序調用存儲在另一個文件中的函數?

方式可以實現:

  1. 考慮蟒蛇功能模塊,並調用它。這裏的約束是我必須將一個python裸函數轉換爲一個會給出錯誤的模塊。

  2. 將代碼(功能代碼)插入到調用函數的程序中。

哪個更好的方法呢?

編輯:謝謝你的所有答覆。已經對我自己的最初困惑闡明瞭很多。另一個疑問是,如果這個人(顯然,不是我)寫了一個os.system(「rm -rf」),該怎麼辦?我最終執行它。那對我來說意味着世界末日,對吧?

編輯2:正如你很多人問我使用exec,我想指出這個thread,最特別的是命名空間問題。它爲用戶提供了很多「規避」python的機會。你不都在想嗎?

+0

能否請你改一下你的問題?很難理解你想要做什麼。 –

+0

我在文本文件中有一個python函數。例如:def abc(a,b):.. return a。這個函數必須從另一個Python程序中調用。 python函數本身不是程序或模塊。我正在努力進一步解釋它。 – Hick

+3

它爲什麼不在.py文件中?畢竟他們只是文本文件! – Johnsyweb

回答

1

可以使用的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

如果該功能需要全球進口,會發生什麼情況? – Hick

+0

函數可以使用通過globals參數傳遞給execfile的任何全局導入http://docs.python.org/library/functions.html#execfile – Jiri

2

編譯()和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')) 
5

您正在尋找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 

鏈接到doc:http://docs.python.org/reference/simple_stmts.html#grammar-token-exec%5Fstmt

您可能還想看看編譯聲明:here

2

像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' 
0

我不知道你是什麼目的,但我想你在一個程序中有功能,你想要的功能運行在另一個程序中。你可以從一到二「編組」功能。

例子,第一個節目:

# 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 
相關問題