подпроцесс python.Popen vs shlex вопрос - PullRequest
0 голосов
/ 24 сентября 2011

моя подпроцессная команда для поиска сначала ищет только один каталог, который я написал (s2), пропускает первый (s1). во-вторых, я читал документы на python и запутался.

мой код

def search_entry(self, widget):
            s1 = subprocess.Popen(['find', '/home/bludiescript/tv-shows', '-type', 'f'], shell=False, stdout=subprocess.PIPE)
            s2 = subprocess.Popen(['find', '/media/FreeAgent\ GoFlex\ Drive/tobins-media', '-type', 'f'],  stdin=s1.stdout, shell=False, stdout=subprocess.PIPE)
            s1.stdout.close()
            self.contents = "\n".join(self.list)
            s2.communicate(self.contents)

Что меня смутило, так это модуль shlex и то, как его использовать вместо подпроцесса. Откройте в моем коде и, если это вообще имеет смысл

так что некоторые хотели бы, чтобы это работало лучше, чем у меня

cmd = 'find /media/FreeAgent\ GoFlex\ Drive/tobins-media -type f find /home/bludiescript/tv-shows -type f'
 spl = shlex.split(cmd)
 s1 = subprocess.Popen(spl, stdout=subprocess.PIPE)
 self.contents = "\n".join(self.list)
        s1.communicate(self.contents)

еще раз спасибо за ваш ввод

Ответы [ 2 ]

2 голосов
/ 24 сентября 2011

Звучит так, как будто вы хотите запустить пару команд и объединить их вывод:

cmds = [
    'find /media/FreeAgent\ GoFlex\ Drive/tobins-media -type f',
    'find /home/bludiescript/tv-shows -type f'
]

ouput = '\n'.join(subprocess.check_output(shlex.split(cmd)) for cmd in cmds)
0 голосов
/ 24 сентября 2011

Попробуйте os.walk вместо вызова find. Это приведет к более надежному коду. Следующее эквивалентно вашему первому вызову find:

top = '/media/FreeAgent GoFlex Drive/tobins-media'
for dirpath, dirnames, filenames in os.walk(top):
    for filename in filenames:
        print os.path.join(dirpath, filename)

Однако это не отвечает на вопрос.

...