2013-12-06 3 views
0

Я хочу прочитать все файлы в каталоге и передать их через командную строку в другую программу. Ниже приведена часть моего кода (для одного файла здесь), который, похоже, не работает, и я не понимаю, почему это не сработает. Мой код (с немного отладки печати):Python: subprocess.Popen поведение переменной

# -*- coding: iso-8859-15 -*- 
# Python 3 

avidemux_dir = "C:\\Program Files (x86)\\Avi Demux\\avidemux.exe" 
start_dir = "F:\\aaa"   # without ending backslash! 
extension = ".mpg" 

import os 
import subprocess 


for dirpath, dirnames, filenames in os.walk(start_dir): 
    if filenames: 
     first_file = os.path.join(dirpath, filenames[0]) 
     test2 = "--load " + first_file   

print(dirpath)    #results in: F:\aaa\av01 
print(first_file)    #results in: F:\aaa\av01\av01.mpg 
print(test2)     #results in: --load F:\aaa\av01\av01.mpg 


p1 = subprocess.Popen([avidemux_dir, "--load", first_file]) 
p2 = subprocess.Popen([avidemux_dir, test2]) 

Для этого примера, Avidemux будет работать (загрузить нужный файл) только для p1. p2 не работает. Почему?

пример командной строки, которая работает в .bat:

avidemux.exe --load F:\aaa\av01\av01.mpg 

Я действительно хотел бы иметь все это в одной строке, как в p2, потому что я присоединяюсь больший список файлов вместе в одну большую строку с правильным переменные для avidemux.

+0

Ожидаете ли вы, что файл будет загружен и сохранен в 'p1'? – aIKid

+1

Несвязанные: вы можете использовать необработанные строковые литералы, такие как 'r" F: \ aaa "' (уведомление: 'r" "prefix), чтобы избежать экранирования обратных косых черт в путях Windows. – jfs

ответ

1

использование

import shlex 
p2 = subprocess.Popen([avidemux_dir] + shlex.split(test2)) 

см docs о командных аргументах в Popen.

1

А, вы передаете строку из двух аргументов. Вы должны разделить его, при необходимости с помощью shlex.split:

p2 = subprocess.Popen([avidemux_dir, *shlex.split(test2)]) 

Или просто передать строку:

p2 = subprocess.Popen(avidemux_dir + ' ' + test2, shell=True) 
1

Просто наткнулся на решение: Не используя список, когда делать что-то подобное. Решение:

test2 = avidemux_dir + " --load " + first_file 

и

p2 = subprocess.Popen(test2) # no more list but the pure string. 
+0

Вы примете существующие ответы? – aIKid

+0

Должно ли это быть 'p2 = subprocess.Popen (test2, shell = True)'? – atupal

+2

@atupal, OP не использует какие-либо метасимволы оболочки здесь, поэтому 'shell = True', похоже, не имеет смысла. –

2

shlex является один подход, но из путей файлов это очевидно, что вы работаете на Windows, и shlex предполагает условные обозначения, используемые в Unix-иш оболочек. Они могут вызвать у вас проблемы с Windows.

Как говорят документы, основной вызов Windows API принимает одну строку в качестве аргумента, поэтому в Windows вы, как правило, намного лучше передаете одну строку в Popen().

Упс! Я вижу, вы уже это обнаружили. Но по крайней мере теперь вы знаете почему ;-)

Смежные вопросы