Ich habe ein Problem beim Öffnen der PDF-Datei.
(Ich benutze Ladon und Python unter mod_wsgi und arbeite mit Apache2. Also auf einem Ubuntu-Apache-Server-System, das auf Windows-System umgestellt wurde.)
Ich versuche das folgende Python-Skript auszuführen:
(wobei str_pdf_file_name = '/var/www/Accounting_Engine/pdfDocuments/File_name.pdf'
)
def preview_pdf(self,str_pdf_file_name):
try:
if sys.version_info[:2] > (2,3):
import subprocess
from subprocess import Popen, PIPE
k = subprocess.Popen(['evince', str_pdf_file_name],stdout=PIPE)
print k.communicate()
else:
os.spawnlp(os.P_NOWAIT, 'evince', 'evince', str_pdf_file_name)
except Exception,msg:
return str(msg)
return str_pdf_file_name
Ich habe die Einschränkungen stdin und stdout in der Datei apache2.conf als deaktiviert
WSGIRestrictStdin Off
WSGIRestrictStdout Off
Und jetzt zeigt die Datei error.log (/var/log/apache2/error.log
):
Cannot parse arguments: Cannot open display: [Wed Oct 10 11:50:24 2012] [error] ('', None)
Ich habe auch os.environ überprüft. Es zeigt wie:
{'LANG': 'C', 'APACHE_RUN_USER': 'www-data', 'APACHE_PID_FILE': '/var/run/apache2.pid', 'PWD': '/home/user', 'APACHE_RUN_GROUP': 'www-data', 'PATH': '/usr/local/bin:/usr/bin:/bin'}
Ich habe auch versucht, die PWD mithilfe der folgenden Codes zu ändern:
import pwd
os.environ["PWD"] = pwd.getpwuid(os.getuid()).pw_dir # Because PWD of 'www-data' was '/var/www'
k = subprocess.Popen(['evince', str_pdf_file_name],env=os.environ,stdout=PIPE)
Aber es gibt keine Änderung in der Ausgabe. Es zeigt immer noch
'Cannot parse arguments: Cannot open display:'
Irgendwelche Vorschläge, was die Ursache sein könnte und wie man das löst?
3 Antworten
# Fetch the pdf file from the server, and keep it in the local matchine
str_loc_file_path = self.fetch_generated_pdf_file_from_server(str_file_path)
# Display the fetched file in local matchine
self.print_pdf(str_loc_file_path)
def fetch_generated_pdf_file_from_server(self, str_file_path,*args):
import httplib
import urllib
conn = httplib.HTTPConnection("192.168.2.10")
str_loc_file_path = '/home/sreejith/pdfDocuments/__filenew__.pdf'
locfile = open(str_loc_file_path,'w')
conn.request("POST",str_file_path)
response = conn.getresponse()
locfile.write(response.read())
locfile.close()
print "Server Response status is"+str(response.status)+", Because of response "+str(response.reason)
print response.getheaders()
return str_loc_file_path
def print_pdf(self,str_file_name,*args): # PRINT THE PDF FILE, str_file_name.
try:
if sys.platform == "win32": # IS OS == WINDOWS
import win32api # PRINT WITH ADOBE VIEWER. SO IT MUST BE INSTALLED
win32api.ShellExecute(0, "print", str_file_name, None, ".", 0)
else: # CAN'T PRINT IF OS IS LINUX, SO OPEN BY A VIEWER FROM WHICH HE CAN PRINT
if sys.version_info[:2] > (2,3):
import subprocess
from subprocess import PIPE
k = subprocess.Popen(['evince', str_file_name],stdout=PIPE)
k.communicate()
else:
k = os.spawnlp(os.P_NOWAIT, 'evince', 'evince', str_file_name)
except Exception,msg:
print str(msg)
msgDlg = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK)
msgDlg.set_markup("<span foreground='blue'>Printer Is Not Connected. And "+str(msg)+".</span>")
msgDlg.run()
msgDlg.destroy()
pass
Das funktioniert bei mir. :-) Hoffnungen hilfreich für jemanden.
Der folgende Link kann für diejenigen nützlich sein, die das gleiche Problem haben.
http://ladonize.org/index.php/Ladon_Attachments
Die Download-Funktion () im obigen Link ist hilfreich.
evince
ist offensichtlich ein Tool mit einer GUI. Sie versuchen, es innerhalb eines Serverprozesses zu öffnen, der normalerweise nicht mit dem Desktop / Benutzer interagieren kann. Unter Linux muss wahrscheinlich ein X-Server ausgeführt werden, was auf Ihrem Server wahrscheinlich nicht der Fall ist. Und genau das sagt Ihnen die Fehlermeldung. Ich denke, Sie müssen Ihre Lösung überdenken.
Update:
Da es nicht offensichtlich ist, wenn Sie nur nach der akzeptierten Antwort suchen und die Kommentare nicht lesen: Das Originalposter löste sein Problem mithilfe der beschriebenen download
-Methode hier
Verwandte Fragen
Neue Fragen
python
Python ist eine dynamisch typisierte Mehrzweck-Programmiersprache mit mehreren Paradigmen. Es wurde entwickelt, um schnell zu lernen, zu verstehen, zu verwenden und eine saubere und einheitliche Syntax durchzusetzen. Bitte beachten Sie, dass Python 2 ab dem 01.01.2020 offiziell nicht mehr unterstützt wird. Fügen Sie für versionenspezifische Python-Fragen das Tag [python-2.7] oder [python-3.x] hinzu. Wenn Sie eine Python-Variante (z. B. Jython, PyPy) oder eine Bibliothek (z. B. Pandas und NumPy) verwenden, fügen Sie diese bitte in die Tags ein.