1

次のように pp(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
4

2 に答える 2

2

ドキュメントはこれを非常によく説明しており、各例はそれを処理する方法を示しています。

submit メソッドのパラメーターの中には、「modules - インポートするモジュール名を持つタプル」があります。送信されたジョブで使用できるようにするモジュールは、ここにリストする必要があります。

したがって、これを行うことができます:

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

またはこれ:

jobs.append(job_server.submit(run, (cmd,), modules=('subprocess',)))
于 2012-05-31T21:22:02.653 に答える
1

申し訳ありませんが、テストされていませんが、試しましたか:

from subprocess import call

「実行」機能内?

そして、「subprocess.call」の代わりに「call」を使用しますか? これにより、「call」は関数に対してローカルになりますが、アクセス可能になります。

于 2012-05-31T21:18:14.637 に答える