4

Pythonのインタラクティブモードを使用してコマンドを一度に1つずつ入力すると、期待どおりに機能するPythonコードがいくつかあります。myscript.pyとして保存して実行すると、同じコードがクラッシュし'C:\Python27\python.exe myscript.py'ます。

同じコードがインタラクティブモードで動作する場合、Pythonコードをスクリプトとして実行するとどのようにクラッシュする可能性がありますか?

この質問は、Pythonがインタラクティブモードであるかどうかを判断する方法を求めています。ただし、質問者は、インタラクティブモードの信頼できる指紋を1つだけ必要とします。インタラクティブモードが異なる方法のリストをお願いします。特に、これが引き起こす可能性のある問題に注意してください。

例えば:

  • sys.path異なる可能性があります
  • os.getcwd()異なる可能性があります
  • os.environ異なる可能性があります
  • この質問に対するすべての答え
  • マルチプロセッシングモジュールのドキュメントの冒頭にあるこの警告

Pythonのインタラクティブモードとスクリプトモードで他に何が違うのでしょうか?

4

3 に答える 3

4

ThreadsとGreenletsは、インタラクティブ環境では異なる動作をします。場合によっては、メインイベントループをハッキングする必要があります。

GreenletgeventPythonの並行タスクであるモジュールからのものです。Python(pthread)とは別に内部コンテキストスイッチングがあり、同時実行性は(私の経験では)非常にうまく機能します。Greenletsの問題のいくつかは、モンキーパッチが適用されていない場合(モジュール内gevent)、Cシステムコールとソケットの相互作用のブロックをブロックすることです。

グリーンレットが正しく機能するためには、メインのイベントループにパッチを適用する必要があります...インタラクティブな環境でグリーンレットを生成すると、コンテキストが切り替えられて実行されないため、パッチを適用する方法を頭のてっぺんから忘れてしまいました。メインイベントループ(後で追加します)。

失敗の例:

In [1]: from gevent.greenlet import Greenlet

In [2]: def print_hi():
   ...:     print 'hi'
   ...:     

In [3]: print_hi()
hi

In [4]: g = Greenlet(print_hi)

In [5]: g.start()

編集:

このプロジェクトのコードのいくつかを見た後、geventを使用するためにipython入力フックをハッキングした方法は次のとおりです

import sys
import select
import gevent

def stdin_ready():
    infds, outfds, erfds = select.select([sys.stdin], [], [], 0)
    if infds:
        return True
    else:
        return False

def inputhook_gevent():
    try:
        while not stdin_ready():
            gevent.sleep(0.001)
    except KeyboardInterrupt:
        pass

    return 0

# install the gevent inputhook
from IPython.lib.inputhook import inputhook_manager
inputhook_manager.set_inputhook(inputhook_gevent)
inputhook_manager._current_gui = 'gevent'

# First import the embeddable shell class
from IPython.frontend.terminal.embed import InteractiveShellEmbed

パッチを当てた例:

In [6]: def say_hi():
   ...:     print "hi"
   ...:     

In [7]: g = gevent.greenlet.Greenlet(say_hi)

In [8]: g.start()

In [9]: hi  <-- Cursor is here so it printed hi
于 2012-05-11T20:20:30.367 に答える
1

ハードウェアを操作しているように見えます。これにより、REPLとスクリプトの最も明白な違いが生じます。

スクリプト内のコマンドはできるだけ早く実行されますが、REPLは人間の入力を待ちます。

つまり、前のコマンドを実行した直後にハードウェアが次のコマンドの準備ができていないというタイミングの問題が発生している可能性があります。

于 2012-05-11T20:15:22.317 に答える
0

Take a look at this line

PCO_api = ctypes.oledll.LoadLibrary("SC2_Cam")

If you can use the COMPLETE path for LoadLibrary

于 2012-05-11T20:40:47.067 に答える