Django:为什么当我通过Django中的popen使用Ghostscript时,是否会收到“找不到文件”错误

问题描述:

我试图使用ghostscript将Django中的pdf转换为jpg,但是当我尝试使用subprocess.popen运行一个ghostscript命令我得到一个“找不到文件”的错误。如果我通过命令行从py文件运行完全相同的脚本,它可以正常工作。Django:为什么当我通过Django中的popen使用Ghostscript时,是否会收到“找不到文件”错误

这里是我的脚本:

sp = subprocess.Popen(['gs', '-dSAFER', '-dNOPAUSE', '-dQUIET', '-dBATCH', '-sDEVICE=jpeg', '-sOUTPUTFILE=' + path + "/static.jpg", path + "/source.pdf"]) 

或:

sp = subprocess.call("gs -dSAFER -dNOPAUSE -dQUIET -dBATCH -sDEVICE=jpeg -sOUTPUTFILE=" + path + "/static.jpg " + path + "/source.pdf") 

这里

import os 
import subprocess 

path = "/tmp/e15hntd/" 

### this next line is what seems to cause the file not found error 

sp = subprocess.Popen("gs -dSAFER -dNOPAUSE -dQUIET -dBATCH -sDEVICE=jpeg -sOUTPUTFILE=" + path + "/static.jpg " + path + "/source.pdf") 

摸索可能的解决办法我试过出错的行如的几个替代版本后是完整的错误:

[错误2]没有这样的文件或目录

回溯:

File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py" in get_response 
111.       response = callback(request, *callback_args, **callback_kwargs) 
File "/usr/local/lib/python2.6/dist-packages/django/contrib/admin/options.py" in wrapper 
366.     return self.admin_site.admin_view(view)(*args, **kwargs) 
File "/usr/local/lib/python2.6/dist-packages/django/utils/decorators.py" in _wrapped_view 
91.      response = view_func(request, *args, **kwargs) 
File "/usr/local/lib/python2.6/dist-packages/django/views/decorators/cache.py" in _wrapped_view_func 
89.   response = view_func(request, *args, **kwargs) 
File "/usr/local/lib/python2.6/dist-packages/django/contrib/admin/sites.py" in inner 
196.    return view(request, *args, **kwargs) 
File "/usr/local/lib/python2.6/dist-packages/django/utils/decorators.py" in _wrapper 
25.    return bound_func(*args, **kwargs) 
File "/usr/local/lib/python2.6/dist-packages/django/utils/decorators.py" in _wrapped_view 
91.      response = view_func(request, *args, **kwargs) 
File "/usr/local/lib/python2.6/dist-packages/django/utils/decorators.py" in bound_func 
21.     return func(self, *args2, **kwargs2) 
File "/usr/local/lib/python2.6/dist-packages/django/db/transaction.py" in inner 
209.     return func(*args, **kwargs) 
File "/usr/local/lib/python2.6/dist-packages/django/contrib/admin/options.py" in change_view 
1054.     self.save_model(request, new_object, form, True) 
File "/home/Django/Update/admin.py" in save_model 
41.    sp = subprocess.call("gs -dSAFER -dNOPAUSE -dQUIET -dBATCH -sDEVICE=jpeg -sOUTPUTFILE=" + unique_path + "/static.jpg " + unique_path + "/source.pdf" + unique_path + "/source.pdf") 
File "/usr/lib/python2.6/subprocess.py" in call 
480.  return Popen(*popenargs, **kwargs).wait() 
File "/usr/lib/python2.6/subprocess.py" in __init__ 
633.        errread, errwrite) 
File "/usr/lib/python2.6/subprocess.py" in _execute_child 
1139.     raise child_exception 
+0

当然,你用'subprocess.Popen',不'subprocess.pOpen'?另外,请包括错误的完整追溯;那里有很多信息可以帮助你。 – 2012-08-19 10:53:47

的错误你得到手段的subprocess模块找不到它要运行可执行文件。

如果脚本命令行中运行,则gs可执行明显存在,所以它看起来像gs可执行文件是不是在你的Django应用程序与运行PATH。如果您指定gs的完整路径(例如/usr/bin/gs),它会有帮助吗?

顺便说一句,我得到同样的错误消息,如果我试图让subprocess启动一个不存在的可执行文件:

Python 2.7.3 (default, Aug 1 2012, 05:14:39) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import subprocess 
>>> subprocess.call("nonexistent") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/subprocess.py", line 493, in call 
    return Popen(*popenargs, **kwargs).wait() 
    File "/usr/lib/python2.7/subprocess.py", line 679, in __init__ 
    errread, errwrite) 
    File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child 
    raise child_exception 
OSError: [Errno 2] No such file or directory 

编辑:如果你的过程中使用的命令行参数,可执行文件名和参数必须指定为单独的列表项,在你尝试第二个在运行gs

Python 2.7.3 (default, Aug 1 2012, 05:14:39) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import subprocess 
>>> subprocess.call("ls /usr") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/subprocess.py", line 493, in call 
    return Popen(*popenargs, **kwargs).wait() 
    File "/usr/lib/python2.7/subprocess.py", line 679, in __init__ 
    errread, errwrite) 
    File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child 
    raise child_exception 
OSError: [Errno 2] No such file or directory 
>>> subprocess.call(["ls", "/usr"]) 
bin games include lib lib32 lib64 local sbin share src X11R6 
0 

第一个例子没有工作,因为我没有一个可执行南编辑ls /usr我的系统上的任何地方。

你能尝试修改您尝试使用的gs完整路径的第二,例如:

sp = subprocess.Popen(['/usr/bin/gs', '-dSAFER', '-dNOPAUSE', '-dQUIET', '-dBATCH', '-sDEVICE=jpeg', '-sOUTPUTFILE=' + path + "/static.jpg", path + "/source.pdf"]) 
+0

我尝试使用完整路径“/ usr/bin/gs”,但我仍然得到相同的错误。 – Finglish 2012-08-19 13:02:38

+0

我现在也试过使用imagemagick,但我得到了和以前一样的子流程相关的错误。 – Finglish 2012-08-19 13:50:27

+0

@英国人:我已经更新了我的答案。它有帮助吗? – 2012-08-19 13:52:49