4

問題 1:sys.stdout.writeが別の関数にラップされていない場合、以下のコードが失敗します。

問題 2:ssys.stdout.writeが別の関数にラップされている場合、コードは各文字の間にスペースを出力します。

コード (v1):

#!/usr/bin/env python

import pp
import sys

def main():
    server = pp.Server()

    for c in "Hello World!\n":
        server.submit(sys.stdout.write, (c,), (), ("sys",))()

if __name__=="__main__":
    main()

痕跡:

$ ./parhello.py
Traceback (most recent call last):
  File "./parhello.py", line 15, in <module>
    main()
  File "./parhello.py", line 12, in main
    server.submit(write, (c,), (), ("sys",))()
  File "/Library/Python/2.7/site-packages/pp.py", line 461, in submit
    sfunc = self.__dumpsfunc((func, ) + depfuncs, modules)
  File "/Library/Python/2.7/site-packages/pp.py", line 639, in __dumpsfunc
    sources = [self.__get_source(func) for func in funcs]
  File "/Library/Python/2.7/site-packages/pp.py", line 706, in __get_source
    sourcelines = inspect.getsourcelines(func)[0]
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 688, in getsourcelines
    lines, lnum = findsource(object)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 527, in findsource
    file = getsourcefile(object)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 446, in getsourcefile
    filename = getfile(object)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 422, in getfile
    'function, traceback, frame, or code object'.format(object))
TypeError: <built-in method write of file object at 0x1002811e0> is not a module, class, method, function, traceback, frame, or code object
make: *** [test] Error 1

コード (v2):

#!/usr/bin/env python

import pp
import sys

def hello(c):
    sys.stdout.write(c)

def main():
    server = pp.Server()

    for c in "Hello World!\n":
        server.submit(hello, (c,), (), ("sys",))()

if __name__=="__main__":
    main()

痕跡:

$ ./parhello.py
H e l l o   W o r l d !
4

1 に答える 1

0

最初の部分では、 pp はビルトインを への引数として扱うようには設計されていませんsubmit。2 番目の問題はより複雑です。pp は、送信された関数を呼び出す前に、stdout と stderr を StringIO オブジェクトにリダイレクトします。タスクが完了すると、StringIO オブジェクトから値が出力されます。

print sout,

soutこれは、内容を印刷する前にスペースを追加することを意味します。これを回避するには、関数をsys.stdout直接使用するのではなく、管理しているファイルまたはキューに出力し、より適切な方法で出力を処理します。

于 2013-01-20T19:17:45.130 に答える