我正在使用mod wsgi在Apache 2.2上運行Python腳本。使用WSGI在守護進程模式下運行pdb
是否可以在wsgi中使用守護進程模式在python腳本中運行pdb.set_trace()?
編輯 我想用守護進程模式而不是嵌入模式的原因是爲了重新加載代碼,而無需每次(其中嵌入模式需要)重新啓動Apache服務器的能力。我希望能夠使用代碼重新加載而無需每次重新啓動Apache並仍然能夠使用pdb ...
我正在使用mod wsgi在Apache 2.2上運行Python腳本。使用WSGI在守護進程模式下運行pdb
是否可以在wsgi中使用守護進程模式在python腳本中運行pdb.set_trace()?
編輯 我想用守護進程模式而不是嵌入模式的原因是爲了重新加載代碼,而無需每次(其中嵌入模式需要)重新啓動Apache服務器的能力。我希望能夠使用代碼重新加載而無需每次重新啓動Apache並仍然能夠使用pdb ...
我有同樣的需要能夠使用強大的pdb
,將pdb.set_trace()
放在任何我想要的地方調試一部分Python服務器代碼。
是,阿帕奇將在一個地方WSGI應用的地方是在你的控制[1]的。但是,我發現了一個很好的折衷辦法是
保持你的Apache WSGIScriptAlias
,也給自己開始在終端你的Python服務器以及(通過在本地,而不是測試Apache了的選項在這種情況下)
所以,如果一個使用WSGIScriptAlias
有點像這樣... 指向您的Python WSGI腳本調用webserver.py
<VirtualHost *:443>
ServerName myawesomeserver
DocumentRoot /opt/local/apache2/htdocs
<Directory /opt/local/apache2/htdocs>
[...]
</Directory>
WSGIScriptAlias /myapp /opt/local/apache2/my_wsgi_scripts/webserver.py/
<Directory /opt/local/apache2/my_wsgi_scripts/>
[...]
</Directory>
[...]
SSLEngine on
[...]
</VirtualHost>
所以你可以webserver.py
有一個簡單的開關正在使用的Apache和入門了手動調試之間去。
保持一個標誌在您的配置文件,例如,在一些settings.py
:
WEBPY_WSGI_IS_ON = True
而且webserver.py
:
import web
import settings
urls = (
'/', 'excellentWebClass',
'/store', 'evenClassier',)
if settings.WEBPY_WSGI_IS_ON is True:
# MODE #1: Non-interactive web.py ; using WSGI
# So whenever true, the Web.py application here will talk wsgi.
application = web.application(urls, globals()).wsgifunc()
class excellentWebClass:
def GET(self, name):
# Drop a pdb wherever you want only if running manually from terminal.
pdb.set_trace()
try:
f = open (name)
return f.read()
except IOError:
print 'Error: No such file %s' % name
if __name__ == "__main__":
# MODE #2: Interactive web.py , for debugging.
# Here you call it directly.
app = web.application(urls, globals())
app.run()
所以,當你想交互地測試出你的網絡服務器,你只要運行它從終端,
$ python webserver.py 8080
starting web...
http://0.0.0.0:8080/
[1] Foo注意:有一些非常複雜的方法可以讓Apache子進程處於你的控制之下,但是我認爲如果你只是想調試你的Python服務器代碼,上面的代碼就簡單多了。如果真的有簡單的方法,那麼我也很想了解這些。
我建議你部署使用FCGI或類似的地方,你可以手動控制Python進程並運行它作爲前臺,設置PDB,但仍然有它連接到Apache。它已知可以工作,與WSGI不同,您無法在該過程中附加終端。 –
難道你不能讓pdb的東西全球化,並使用一個祕密的URL /密鑰來啓用/禁用它?你有一種編程語言,具有反射功能,並且可以隨時隨地注入任意代碼。禁用時應爲零成本。 – synthesizerpatel