2014-07-06 44 views
1

我有一個使用execfile並在子進程中運行腳本的主進程。這工作正常,除非腳本在另一個目錄 - 然後一切都崩潰了。多處理時全局變量NameError,只在子目錄中

這是mainprocess.py

from multiprocessing import Process 

m = "subdir\\test.py" 

if __name__ == '__main__': 
    p = Process(target = execfile, args = (m,)) 
    p.start() 

然後在子目錄中恰當地命名爲子目錄,我有test.py

import time 

def foo(): 
    print time.time() 

foo() 

當我運行mainprocess.py,我得到的錯誤:

NameError: global name 'time' is not defined 

但問題不限於模塊名稱 - sometim es我會在其他代碼段上的函數名稱上發生錯誤。

我試過在mainprocess.pyif聲明裏面輸入時間,但都沒有任何影響。

避免錯誤的一種方法(我沒有試過這個),是將test.py複製到父目錄並在文件中插入一行到os.chdir回到原始目錄。但是,這似乎相當sl。。

那麼發生了什麼?

+0

爲什麼不使用內置的,全局和局部命名空間的說明這個['subprocess'](https://docs.python.org/2/library/subprocess.html)模塊? – dano

回答

1

的解決辦法是改變你的進程初始化:

p = Process(target=execfile, args=(m, {})) 

老實說,我不完全知道爲什麼這個工程。我知道這與導入的時間添加到哪個詞典(本地人與全球人)有關。看來,當你在進口時test.py做,它像對待一個局部變量,因爲下面的作品,如:

import time  # no foo() anymore 
print(time.time()) # the call to time.time() is in the same scope as the import 

然而,以下也適用:

import time 
def foo(): 
    global time 
    print(time.time()) 
foo() 

這第二個示例說明我認爲導入仍然分配到一些種全局命名空間,我只是不知道如何或爲什麼。

如果你正常地調用execfile()而不是在一個子進程中,一切運行良好,事實上,你可以在主進程中調用execfile()調用之後的任何地方使用時間模塊,因爲時間有被帶入相同的命名空間。我認爲,既然你是在一個子進程中啓動它,那麼沒有模塊級別的命名空間用於分配導入(execfile在調用時不會創建模塊對象)。我認爲,當我們將空字典添加到對execfile的調用中時,我們將添加提供全局字典參數,從而爲導入機制提供全局名稱空間,以將名稱時間分配給。

爲背景的某些鏈接:

1)Tutorial page on namespaces and scope - 看看這裏的第一

2)Python docs on execfile command

3)A very similar question on a non-SO site