Python с посланником, как использовать переменные - PullRequest
3 голосов
/ 23 января 2012

Я пытаюсь использовать Python envoy для лучшего доступа к программам Shell.Но у меня проблема в том, что я хочу удалить все элементы папки, но посланник не может обработать мою переменную:

import envoy
import os

# Check for a empty folder. 
if len(os.listdir(csv_save_path)) != 0:
    for item in os.listdir(csv_save_path):
        result = envoy.run('rm -v',item)
        print result.std_out
        print result.std_err

Вывод:

"rm: missing operand\nTry `rm --help' for more information.\n"

Я не хочуиспользовать подпроцессы.У кого-нибудь есть идея, что не так?

Редактировать:

Спасибо за ваш быстрый ответ.Теперь я получаю это сообщение об ошибке:

    Exception in thread Thread-4:
Traceback (most recent call last):
  File "/usr/lib64/python2.7/threading.py", line 552, in __bootstrap_inner
    self.run()
  File "/usr/lib64/python2.7/threading.py", line 505, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib64/python2.7/site-packages/envoy/core.py", line 40, in target
    bufsize=0,
  File "/usr/lib64/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/usr/lib64/python2.7/subprocess.py", line 1228, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

*** AttributeError: 'NoneType' object has no attribute 'returncode'

Но я проверяю путь к файлу, с и без пути, он терпит неудачу.

Редактировать: Решение состоит в том, чтобы использовать% s, чтобы доставить предмет в нужное место.

import envoy
import os

# Check for a empty folder. 
if len(os.listdir(csv_save_path)) != 0:
    for item in os.listdir(csv_save_path):
        result = envoy.run('rm -v %s' % item)
        print result.std_out
        print result.std_err

пока

Ответы [ 3 ]

4 голосов
/ 23 января 2012

Второй параметр envoy.run - это время ожидания. Вы хотите:

# The check for the empty folder is superfluous
for item in os.listdir(csv_save_path):
    filepath = os.path.join(csv_save_path, item)
    result = envoy.run(['rm', '-v', '--', filepath])
    print (result.std_out)
    print (result.std_err)

Кстати, почему вы используете командную строку rm вместо Python os.unlink?

1 голос
/ 09 мая 2012

Попробуйте это

import envoy
import os

# Check for an empty folder. 
if len(os.listdir(csv_save_path)) != 0:
    for item in os.listdir(csv_save_path):
        result = envoy.run('rm -v %s' % item)
        print "Output: %s" % result.std_out
        print "Error: %s" % result.std_err
0 голосов
/ 18 марта 2013

Вы также можете использовать shlex.split , чтобы помочь вам сформировать список для предоставления в envoy.run () вместо того, чтобы создавать / кодировать список вручную.

Например

>>> from shlex import split
>>> split("rm -v -- filename")
['rm', '-v', '--', 'filename']

В вашем случае код будет выглядеть так:

from shlex import split
# ......
result = envoy.run(split('rm -v %s' % (item)))
...