我試着使用exec語句導入模塊,但它失敗了,exec語句Python和進口模塊
code.py
def test(jobname):
print jobname
exec ('import ' + jobname)
if __name__ = '__main__':
test('c:/python27/test1.py')
錯誤: 語法錯誤:
輸入:C: \ python27 est1.py
我試着使用exec語句導入模塊,但它失敗了,exec語句Python和進口模塊
code.py
def test(jobname):
print jobname
exec ('import ' + jobname)
if __name__ = '__main__':
test('c:/python27/test1.py')
錯誤: 語法錯誤:
輸入:C: \ python27 est1.py
不知何故,我想你一定是打電話
test('c:\python27\test1.py')
代替
test('c:/python27/test1.py')
在t
前面反斜槓被解釋爲製表符。因此,錯誤
import:c:\python27 est1.py
注意缺失t
。
其次,import
命令需要模塊名稱,而不是路徑。對於導入,請使用__import__
而不是exec
或execfile
。 execfile
已從Python3中刪除,因此爲了將來的兼容性,您可能不想在Python2中使用它。 exec
可以用來代替,但也有problems with using exec
.
假設c:\python27
是在你的PYTHONPATH,你可以 做這樣的事情:
def test(jobname):
print jobname
__import__(jobname)
if __name__ == '__main__':
test('test1')
你可能意味着execfile(jobname)
。導入不適用於文件名。它適用於軟件包名稱。任何好的教程都會涵蓋這一點。另一個問題是被解釋爲一個製表符\ t,但在這裏,因爲你是uaing斜線不baclslash它是不是這樣的......
def test(jobname):
print jobname
a = jobname.split('/')
b = "/".join(a[0:-1])
c = a[-1][0:-3]
sys.path.append(b)
exec ('import ' + c)
if __name__ = '__main__':
test('c:/python27/test1.py')
試試這個代碼。您的路徑必須添加到sys.path()變量。
Im trying to import a module using exec statement
不這樣做。
首先,你是否真的需要以編程方式導入模塊?如果您告訴我們您實際上想要完成的任務,我敢打賭,我們可以爲您的方形頁面找到方形洞,而不是教您如何將其強制進入圓形洞。
如果您確實需要這樣做,請使用the imp
module;這就是它的目的。
特別是如果你想通過路徑而不是模塊名稱導入模塊,這是import
聲明不可能做到的(而exec
不會幫你做到這一點)。
下面是一個例子:
import imp
def test(jobname):
print jobname
while open(jobname, 'r') as f:
job = imp.load_module('test', f, jobname, ('.py', 'U', 1))
當然,這並不做同樣的事情,import test1
會做,如果它是你的sys.path
。該模塊將在sys.modules['test']
而不是sys.modules['test1']
,並在本地變量job
而不是全局變量test1
,它將重新加載,而不是如果您已經加載它什麼都不做。但任何有充分理由做這種事情的人最好都知道如何處理所有這些問題。
我有一個系統,我們需要每天處理多個文件。每個文件需要處理4種不同的方式。 – user1050619
然後,您需要重新設計代碼的組織方式並使用'imp',否則您可以使用execfile或使用子進程包。單獨閱讀更多內容,或者在其他問題上詢問有關問題。 – jadkik94
一切@ jadkik94說是現貨。但是可能有更簡單的答案。你有一套靜態的四個模塊。爲什麼這些需要動態導入?爲什麼不只是'import test1;進口測試2;進口測試3;導入test4'? (即使你需要迭代模塊,這也不是問題:只要執行'mymodules = [test1,test2,test3,test4]',你甚至可以動態地使用'mymodules = [sys.modules [module]模塊在sys.modules中,如果module.startswith('test')'。 – abarnert
不知道爲什麼有空格,如果你注意到我通過的參數沒有空格 – user1050619
我敢打賭,這不是你的實際代碼,如果你把它粘貼到解釋器或腳本中,它會給出不同的錯誤。你實際要求它做的是'import c:/ python27/test1.py'(沒有引號,路徑而不是模塊名稱等),這是假的,會給出一個SyntaxError,但不是這個。您的實際代碼可能使用反斜槓而不是斜線,並且不會轉義'\ t',這就是您遇到此特定錯誤的原因。 – abarnert