0

この問題は非常に複雑で、私を夢中にさせています。どんな助けでも大歓迎です!

DjangoPython モジュール (Python バージョン 2.6、フレームワーク、バージョン 1.4)によって呼び出される基本的な C コードがいくつかあります。SWIG2.0.9までのPython バインディングを構築しました。python manage.py shellプロンプトから使用しました。彼らはうまくいっています。

を実行するpython manage.py runserver 0.0.0.0:8001と、すべてがまだ正常に機能しています。しかし、アプリケーションを Apache 仮想ホストとしてデプロイすると、Python バインディングが突然失敗します (C コードを使用しない他の Web ページは問題ありません)。その URL はhttp://hostname.com/basicのようなものです。これが私たちのconfファイルです:

#Listen 80
<VirtualHost *:80>
  ServerName hostname.com/basic
  ServerAdmin caisj@example.com

  ProxyRequests Off
  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>

  DocumentRoot /home/browser/BASIC/basic

  Alias /static/admin /home/browser/BASIC/_py/lib/python2.6/site-packages/Django-1.4-py2.6.egg/django/contrib/admin/static/admin
  Alias /static /home/browser/BASIC/basic/static

  WSGIScriptAlias /basic /home/browser/BASIC/basic/basic.wsgi
  ErrorLog /home/browser/BASIC/basic/log/basic.error.log

  <Directory /home/browser/BASIC/basic>
    <Files basic.wsgi>
      Order deny,allow
      Allow from all
    </Files>
  </Directory>

  LogLevel info
  CustomLog /home/browser/BASIC/basic/log/basic.access.log combined

C コードを 2 回クエリする必要があります。最初のものは引き続き機能し、正しい結果を返します。しかし、2 回目の試行はクラッシュするだけです。コードは停止し、何も返されません。いくつかのコード スニペット:

from some.basic import rmq       # this is the Python binding created by SWIG
class Maxi:
  @staticmethod
  @contextmanager
  def open(rmqfile):
    driver = None
    try:
      driver = Maxi(rmqfile)
      yield driver
    finally:
      if driver: driver.close()

  def __init__(self, rmqfile):
    with open(rmqfile) as f:
      self.rmqfile = yaml.load(f)
    self.handlers = dict()

  # The rmq.i:
  # int       rmq_query (rmq_track t, unsigned int p, unsigned int q);
  # rmq_track rmq_load (char filename[]);
  def query(self, chrom, start, end):
    h = rmq.rmq_load(self.rmqfile[chrom]))
    rs = rmq.rmq_query(h, start-1, end-1)       # It works and result is correct
    rs = rmq.rmq_query(h, start-1+1, end-1+1)   # !!! Crashes here !!!
    return rs

  def close(self):
      for h in self.handlers.itervalues():
          rmq.rmq_unload(h)

# ==== Django views code ====
driver = Maxi('yaml_config_file_to_load')
result.append(driver.query('chr1', 1, 100000)

ファイルのアクセス許可の問題が原因であると推測しました。しかし、すべての Python バインディング ファイルを 777 に設定しても、Apache 仮想ホストとして動作すると失敗します。

dirver.close()ステートメントを削除しようとしましたが、まだ失敗しました。コード トレースの後、close()メソッドが呼び出されることはありません。

おそらく、Python バインディングのライフ サイクルが適切に管理されない原因となる構成がいくつかあるのでしょう。しかし、その理由を特定することはできません。

助けてください。どうもありがとう。

==================

アップデート:

http://code.google.com/p/modwsgi/wiki/ApplicationIssues#Python_Simplified_GIL_State_APIを読んだ後、ファイルに次のように追加しconfます。

WSGISocketPrefix /var/run/wsgi
WSGIApplicationGroup %{GLOBAL}
WSGIPythonHome /home/browser/BASIC/_py
<VirtualHost *:80>
  ......
  WSGIApplicationGroup %{GLOBAL}
  WSGIDaemonProcess hostname.com/basic processes=2 threads=15 display-name=%{GROUP}
  WSGIProcessGroup hostname.com/basic
  ......
</VirtualHost>

しかし、それはエラーを報告します:

Premature end of script headers: basic.wsgi
4

2 に答える 2

1

ここに記載されている SWIG に関する問題の解決策:

また、必ずお読みください:

于 2013-04-21T22:32:39.993 に答える