Использование подпроцесса с Python - PullRequest
1 голос
/ 16 апреля 2011

Я создаю приложение Django, которое принимает входной файл от пользователя.Я хочу использовать модуль подпроцесса, чтобы взять файл и передать его в качестве аргумента внешнему сценарию и вернуть результаты.Какой будет формат для подпроцесса. Откройте вызов.Я хотел бы также передать опцию сценарию, например -a.Другими словами, как будет выглядеть вызов subprocess.Popen для командной строки, которая выглядит примерно так:

./myscript -option file

Также есть какие-либо проблемы, связанные с путем скрипта, который я пытаюсь запустить.Большое спасибо.

Это код, который я использую в моем views.py.Я просто пытаюсь понять, работает ли простая команда cp и как передать аргументы:

def upload_file(request):

    if request.method == 'POST':
    form=UploadFileForm()        
    form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            handle_uploaded_file(request.FILES['file'])
            return HttpResponseRedirect('/upload')
    else:
        form = UploadFileForm()
    return render_to_response('upload_file.html', {'form': form})

def handle_uploaded_file(f):

    p=subprocess.Popen(['/bin/cp',f , '/home/dutzy/Desktop'])

Ответы [ 3 ]

5 голосов
/ 16 апреля 2011

subprocess.Popen имеет довольно понятный синтаксис:

subprocess.Popen(['./myscript', '-option', 'file'])

Просто посмотрите на примеры, и вы получите шаблон.

1 голос
/ 16 апреля 2011

request.FILES['file'] не является строковым именем файла;это UploadedFile объект. Обратитесь к документации Django , чтобы узнать, что вы можете сделать с этим объектом.

Плохо пытаться получить путь и выполнить копию, посколькусломается для удаленного пользователя.При таком использовании веб-браузер загружает данные файла на ваш сервер, который передает их Django, который создает файл UploadedFile для их обработки.Чтобы просто скопировать этот файл на диск, вам понадобится такой код:

def handle_uploaded_file(f):
    destination = open('path/to/store/at/' + f.name, 'wb+')
    for chunk in f.chunks():
        destination.write(chunk)
    destination.close()

Если вы не хотите использовать загруженное имя, используйте что-то еще, кроме f.name.Если вы хотите выполнить команду для загруженного файла, сначала сохраните ее где-нибудь (возможно, во временном файле), а затем используйте subprocess.Popen для запуска команды.

1 голос
/ 16 апреля 2011

Вы просто передаете кортеж или список вашего двоичного имени (в $PATH или относительно) и его аргументов.

import subprocess
p = subprocess.Popen(('./myscript', '-option', 'file'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...