Django Python OSError没有这样的文件或目录,但文件存在

时间:2017-08-01 23:25:22

标签: python django subprocess unoconv

我正在使用unoconv与LibreOffice将doc和docx文件转换为服务器中的pdf。我需要将已转换的文件上传到S3。

我可以成功转换文件,我可以在服务器中看到它们。

但是当我尝试上传pdf时,我收到错误。我错过了什么?

提前致谢

这很好用:

import subprocess
from boto.s3.connection import S3Connection, Bucket, Key

def doc_to_pdf(user):
    '''
    Convert doc or docx to PDF.

    parameter user: is a request.user

    Usage:
        doc_to_pdf(self.request.user):
    '''

    user_cv = CandidateCV.objects.get(user=user)
    user_cv_file = str(user_cv.resume).split('/')[-1] # tem que ser PDF
    user_cv_filetype = user_cv_file.split('.')[-1]

    if not user_cv_filetype in settings.PDF_FILE_TYPE:
        # Se não for PDF
        file_in = user_cv.resume.url
        file_name = file_in.split('/')[-1]
        # download
        urllib.request.urlretrieve(file_in, file_name)
        file_out = user_cv_file.split('.')[0] + '.pdf'

        # converte para PDF
        env = os.environ.copy()
        env['HOME'] = '/tmp'
        subprocess.Popen(["unoconv","-f", "pdf", "%s" % (file_in)], env = env)

        # Define a path para salvar o documento na S3
        resume_path = 'resumes/%s/' % str(date.today())

        # key é o nome do arquivo na S3
        key = '%s%s' % (resume_path, file_out)

        # deleta o arquivo localmente
        subprocess.call("rm -f %s" % user_cv_file, shell=True)

        # Salva o novo formato no banco
        user_cv.resume = key
        user_cv.save()

这是我在行中收到错误的代码:k_out.set_contents_from_filename(s3file)

def s3upload(s3file):

    # Conecta na AWS S3
    conn = S3Connection(settings.AWS_ACCESS_KEY_ID, settings.AWS_SECRET_ACCESS_KEY)
    bucket_out = Bucket(conn, settings.AWS_STORAGE_BUCKET_NAME)
    k_out = Key(bucket=bucket_out, name=s3file)

    # Define a path para salvar o documento na S3
    resume_path = 'resumes/%s/' % str(date.today())

    # key é o nome do arquivo na S3
    key = '%s%s' % (resume_path, s3file)
    k_out.key = key

    # Salva na AWS S3
    k_out.set_contents_from_filename(s3file)
    k_out.make_public()

    # deleta o arquivo localmente
    subprocess.call("rm -f %s" % s3file, shell=True)

这是追溯:

IOError at /pt-br/dashboard/jobcombo/25-mnj70998-809898m-nh8/candidate-base/
[Errno 2] No such file or directory: '/opt/python/bundle/42/app/da15ad64-ef23-47ff-b6f0-f2f8e0cdc2c2.pdf'

Traceback:
File "/opt/python/run/venv/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/opt/python/run/venv/lib/python2.7/site-packages/django/views/generic/base.py" in view
  71.             return self.dispatch(request, *args, **kwargs)
File "/opt/python/run/venv/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapper
  34.             return bound_func(*args, **kwargs)
File "/opt/python/run/venv/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
  22.                 return view_func(request, *args, **kwargs)
File "/opt/python/run/venv/lib/python2.7/site-packages/django/utils/decorators.py" in bound_func
  30.                 return func.__get__(self, type(self))(*args2, **kwargs2)
File "/opt/python/current/app/combo/views.py" in dispatch
  3190.         return super(CandidateBase, self).dispatch(*args, **kwargs)
File "/opt/python/run/venv/lib/python2.7/site-packages/django/views/generic/base.py" in dispatch
  89.         return handler(request, *args, **kwargs)
File "/opt/python/current/app/combo/views.py" in post
  3560.                     s3upload(user_cv_file)
File "/opt/python/current/app/combo/aws_upload.py" in s3upload
  107.     k_out.set_contents_from_filename(file_to_upload)
File "/opt/python/run/venv/lib/python2.7/site-packages/boto/s3/key.py" in set_contents_from_filename
  1370.         with open(filename, 'rb') as fp:

1 个答案:

答案 0 :(得分:1)

原来unoconv需要2秒才能执行文件转换。 所以对于文件转换,我必须设置:

p = subprocess.Popen('blah')
p.wait()

一周后我就开始工作了。

由于