2012-10-22 59 views
1

我試着使用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

+0

不知道爲什麼有空格,如果你注意到我通過的參數沒有空格 – user1050619

+0

我敢打賭,這不是你的實際代碼,如果你把它粘貼到解釋器或腳本中,它會給出不同的錯誤。你實際要求它做的是'import c:/ python27/test1.py'(沒有引號,路徑而不是模塊名稱等),這是假的,會給出一個SyntaxError,但不是這個。您的實際代碼可能使用反斜槓而不是斜線,並且不會轉義'\ t',這就是您遇到此特定錯誤的原因。 – abarnert

回答

1

不知何故,我想你一定是打電話

test('c:\python27\test1.py') 

代替

test('c:/python27/test1.py') 

t前面反斜槓被解釋爲製表符。因此,錯誤

import:c:\python27 est1.py 

注意缺失t

其次,import命令需要模塊名稱,而不是路徑。對於導入,請使用__import__而不是execexecfileexecfile已從Python3中刪除,因此爲了將來的兼容性,您可能不想在Python2中使用它。 exec可以用來代替,但也有problems with using exec.

假設c:\python27是在你的PYTHONPATH,你可以 做這樣的事情:

def test(jobname): 
    print jobname 
    __import__(jobname) 

if __name__ == '__main__': 
    test('test1') 
4

你可能意味着execfile(jobname)。導入不適用於文件名。它適用於軟件包名稱。任何好的教程都會涵蓋這一點。另一個問題是被解釋爲一個製表符\ t,但在這裏,因爲你是uaing斜線不baclslash它是不是這樣的......

+0

execfile與「import」不同。 – abarnert

+0

@abarnert是的。但從我發佈的代碼中瞭解到的,這是'exec(import ...)'的預期用法。 – jadkik94

+0

執行'exec(「import foo」)'(例如,'print(foo.myfunc(foo.myconst))')將會在'execfile(「foo.py」)後工作。所以它不能用於預期的用途。有可能他可以重寫所有的代碼,使其工作方式不同(假設模塊之間沒有衝突的名稱等),但是如果他要重寫所有代碼,則有更好的解決方案。 – abarnert

0
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()變量。

+0

這只是混亂PYTHONPATHtoo很多,以及如果該文件的擴展是.pyc或.pyo? – jadkik94

+0

他想運行一個.py文件。一個問題男人的一個配方。 @ jadkik94 –

+0

@ jadkik94:正如所寫的,'test'不處理.pyc/.pyo(或.pyw,因爲這是Windows),它也不會處理反斜槓,並且可能還有其他問題,但它編寫沒有這些問題的版本會很簡單,所以基本的方法是合理的(除了混亂的PYTHONPATH,這是一個問題)。 – abarnert

0

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,它將重新加載,而不是如果您已經加載它什麼都不做。但任何有充分理由做這種事情的人最好都知道如何處理所有這些問題。

+0

我有一個系統,我們需要每天處理多個文件。每個文件需要處理4種不同的方式。 – user1050619

+0

然後,您需要重新設計代碼的組織方式並使用'imp',否則您可以使用execfile或使用子進程包。單獨閱讀更多內容,或者在其他問題上詢問有關問題。 – jadkik94

+0

一切@ jadkik94說是現貨。但是可能有更簡單的答案。你有一套靜態的四個模塊。爲什麼這些需要動態導入?爲什麼不只是'import test1;進口測試2;進口測試3;導入test4'? (即使你需要迭代模塊,這也不是問題:只要執行'mymodules = [test1,test2,test3,test4]',你甚至可以動態地使用'mymodules = [sys.modules [module]模塊在sys.modules中,如果module.startswith('test')'。 – abarnert