2010-07-20 101 views
1

對不起,如果這是一個重複的問題,但在搜索「django子流程」的3個頁面後,我無法找到我的特定問題的答案。Django奇怪的子流程問題

我試圖在tex文件上運行pdflatex,但由於某種原因,在Django中它不會產生任何東西。不過,它在普通的python腳本中工作得很好。我在這裏省略了大部分代碼,但這基本上是重要的一點。我使用mod_wsgi在apache2上運行此操作,並且我懷疑它可能是apache權限相關的問題,儘管如此。 在此先感謝。

import subprocess 
test = subprocess.Popen(['pdflatex','/home/sheepz/test.tex'],shell=True, stdout=subprocess.PIPE) 
log = open('/home/sheepz/log.log', 'w') 
log.write(str(test.communicate())) 
log.close() 

the content of the file "log.log": 

('This is pdfTeX, Version 3.1415926-1.40.10 (TeX Live 2009/Debian)\n restricted \\write18 enabled.\n**\n! End of file on the terminal... why?\n', None) 

編輯: 這個問題的解決方案很容易。我只是想在這裏添加它,所以每個遇到問題的人都可以找到它。基本上,它涉及使用WSGIDaemonProcess配置指令以不同的用戶身份運行站點,而不是使用www數據。下面是一個最小配置:

ServerName www.mysite.com 
ServerAlias *mysite.com 
WSGIDaemonProcess www.mysite.com user=joe group=joe home=/home/joe/ 
WSGIProcessGroup www.mysite.com 

而且,這將是最好添加WSGIRestrictStdout Off到你的httpd.conf,因爲,據我瞭解,mod_wsgi的忽略嘗試使用標準輸出的任何過程。謝謝,格雷厄姆。

+1

你使用什麼操作系統? SE Linux已啓用? – 2010-07-20 12:15:06

+0

Ubuntu 10.04 LTS,所以SELinux默認不安裝。 – 2010-07-20 12:32:36

+1

WSGIRestrictStdout不是必須的,它使用mod_wsgi 3.X,因爲現在默認允許stdout訪問,因爲用戶更喜歡編寫非可移植的WSGI應用程序。 – 2010-08-02 01:48:09

回答

1

在命令中指定'pdflatex'的絕對路徑。 Apache用戶PATH可能不會像您的個人帳戶那樣查看相同的目錄。另外,Apache作爲一個特殊用戶運行,不會有寫入權限的地方。建議您使用mod_wsgi守護進程模式並指定該守護進程按照您而不是Apache用戶運行。請閱讀關於mod_wsgi網站的文檔,瞭解如何做到這一點。

+0

謝謝,我會對此進行閱讀,但是我會解決這個問題,直到我解決了這個問題。 – 2010-07-20 23:59:18