2010-07-20 70 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