2012-05-31 2 views
1

Я пытался использовать С. (Parallel Python), как это:Почему этот код не работает параллельно питона

import glob 
import subprocess 
import pp 


def run(cmd): 
    print cmd 
    subprocess.call(cmd, shell=True) 

job_server = pp.Server() 
job_server.set_ncpus(8) 
jobs = [] 
for a_file in glob.glob("./*"): 
    cmd = "ls" 
    jobs.append(job_server.submit(run, (cmd,))) 
for j in jobs: 
    j() 

Но встречаются такие ошибки, что subprocess.call не является глобальное имя.

An error has occured during the function execution 
Traceback (most recent call last): 
    File "/Library/Python/2.7/site-packages/pp-1.6.1-py2.7.egg/ppworker.py", line 90, in run 
    __result = __f(*__args) 
    File "<string>", line 3, in run 
NameError: global name 'subprocess' is not defined 

Я импортировал подпроцесс, почему он не может быть использован здесь?

Согласно предложению abarnert, я изменил код так:

import glob 
import pp 
def run(cmd): 
    print cmd 
    subprocess.call(cmd, shell=True) 
job_server = pp.Server() 
job_server.set_ncpus(8) 
jobs = [] 
for a_file in glob.glob("./*"): 
    cmd = "ls" 
    jobs.append(job_server.submit(run, (cmd,),modules=("subprocess",))) 
for j in jobs: 
    j() 

Но она по-прежнему не работает, он жалуется, как это:

Traceback (most recent call last): 
    File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner 
    self.run() 
    File "/usr/lib/python2.6/threading.py", line 484, in run 
    self.__target(*self.__args, **self.__kwargs) 
    File "/usr/local/lib/python2.6/dist-packages/pp-1.6.1-py2.6.egg/pp.py", line 721, in _run_local 
    job.finalize(sresult) 
UnboundLocalError: local variable 'sresult' referenced before assignment 
+0

Эта новая проблема совершенно иная, и не имеет отношения к вашему исходному, и вы, вероятно, следует написать отдельный вопрос для Это. Но вкратце: задания PP не могут порождать новые процессы, не вызывая всевозможных проблем, и я не знаю, что у кого-то есть исправление. Кроме того, любая проблема, которая приводит к разрушению труб (которые пытаются породить новые процессы) приведет к ошибке «sresult referenced before assign», которая должна быть исправлена ​​в будущей версии. Вероятно, вы хотите обсудить это на форумах PP. – abarnert

+0

В частности, начинайте здесь: http://www.parallelpython.com/component/option,com_smf/Itemid,29/topic,408.0 – abarnert

ответ

2

Документация объясняет это довольно хорошо, и каждый пример показывает вам, как с этим бороться.

Среди параметров метода отправки есть «модули - кортеж с именами модулей для импорта». Любые модули, которые вы хотите получить в представленном задании, должны быть перечислены здесь.

Таким образом, вы можете сделать это:

jobs.append(job_server.submit(run, (cmd,),(), ('subprocess',))) 

Или это:

jobs.append(job_server.submit(run, (cmd,), modules=('subprocess',))) 
+0

yup. это объясняется в самом первом примере в документах - http://www.parallelpython.com/content/view/17/31/ –

+0

Спасибо, abarnert, я изменил свои коды как ваше предложение, но он встречает другую ошибку, как то, что я добавлен в мой вопрос .. –

1

К сожалению, не проверялось, но не так попробуйте:

from subprocess import call 

Внутри функции «запуска»?

А затем использовать «вызов» вместо «subprocess.call»? Это сделало бы «вызов» локальным для функции, но доступным.

+0

привет, я пробовал это, но он просто жалуется: вызов 'NameError: global name ' 'не определен'' –

+0

Поместите импорт внутрь функции; пересмотренный ответ. – mikebabcock

Смежные вопросы