2013-04-25 32 views
6

我搜索了網站和本網站,無法找到這個問題的答案。我確定它在我面前的某個地方,但無法找到它。Python - 基於字符串的導入模塊,然後傳遞參數

我需要能夠基於字符串導入模塊。然後在傳遞參數的同時在該模塊中執行一個函數。

我可以根據字符串導入,然後使用eval()執行,但我知道這不是處理這個問題的最佳方法。我似乎也無法通過這樣的論點。

我將基於字符串設置的當前模塊名爲TestAction.py,並位於名爲Tasks的文件夾中。 這是TestAction.py的內容:

def doSomething(var): 
    print var 

這是我執行導入TestAction和執行代碼。

module = "Tasks.TestAction" 
import Tasks 
mymod = __import__(module) 
eval(module + ".doSomething()") 

我怎樣才能使此代碼#1沒有使用eval()和#2通過VAR參數doSomething()

在此先感謝!

回答

2

函數名稱是否也可變?如果沒有,只是用你的導入模塊:

mymod.doSomething('the var argument') 

如果是,使用getattr

fun = 'doSomething' 
getattr(mymod, fun)('the var argument') 
0

如果您使用Python 2.7或3.1以上版本去最簡單的方法是使用importlib模塊與getattr結合。您的代碼將看起來像那麼:

import importlib 

module = "Tasks.TestAction" 
mymod = importlib.import_module(module) 
myfunc = getattr(mymod, "doSomething") 
myfunc() 
0

我最近寫了一個簡單的函數,導入一個給定的功能,它似乎爲我工作:

def import_function(name): 
    """Import a function by name: module.function or 
    module.submodule.function, etc. Return the function object.""" 

    mod, f = name.rsplit('.', 1) 
    return getattr(__import__(mod, fromlist=[f]), f) 

你可以使用它作爲:

f = import_function('Tasks.TestAction.doSometing') 
f() 

或只是

import_function('Tasks.TestAction.doSometing')() 
1

一ccording的文檔

最好是使用importlib.import_module()以編程方式導入模塊。

利用這一點,你可以檢索你的模塊是這樣的:

import importlib 
TestAction = importlib.import_module("TestAction", package="Tasks") 

之後,你可以簡單地調用功能正常或名稱:

TestAction.some_known_function(arg1, arg2) 
getattr(TestAction, "some_other_function_name")(arg1, arg2) 

我希望這回答了你的問題,感覺可以自由闡述,如果你仍然錯過了一些東西。

+0

我有一個用例限於Python2.6。 _not_使用importlib有什麼缺點?由於importlib在2.6中不存在,我沒有選擇。但我想知道可能會出現什麼問題?我假設必須有一些可能的問題,否則importlib不會被創建。 – synaptik 2018-01-05 23:03:01

2

謝謝大家的幫助。它看起來像importlib結合getattr是我所需要的。爲了將來的參考,這裏是爲我工作的確切代碼。

module = "FarmTasks.TestAction" 
mymod = importlib.import_module(module) 

ds = getattr(mymod, "doSomething") 
ds("stuff")