какая команда эквивалентна в Python - PullRequest
1 голос
/ 26 сентября 2011

У меня есть следующий код, который я использую, чтобы проверить, существует ли программный дамп класса в системе. Программа возвращает только пробел.

cmd = ["which","class-dump"]
process =  subprocess.Popen(cmd, stdout=subprocess.PIPE)
print process.stdout.read()

Этот код всегда возвращает пробел. Технически это должно работать правильно?

Ответы [ 5 ]

3 голосов
/ 26 сентября 2011

Я попробовал следующее на моей машине, и она отлично работает.

import subprocess
cmd = ["which","java"]
process =  subprocess.Popen(cmd, stdout=subprocess.PIPE)
print process.communicate()

это вывод

('/usr/bin/java\n', None)
1 голос
/ 26 сентября 2011

which - встроенная оболочка.Вам нужно передать shell=True Попену.

0 голосов
/ 26 сентября 2011

Этот код выполняет то же самое, что и команда shell which программно, за исключением того, что он не "находит" символические ссылки.Для поддержки этого вы можете улучшить функцию isx.

import os.path, itertools
isx = lambda program: lambda folder: (lambda p: \
    os.access(p, os.X_OK) and os.path.isfile(p))(os.path.join(folder, program))

def which(program):
  try:
    return itertools.ifilter(isx(program), os.environ['PATH'].split(':')).next()
  except StopIteration:
    raise ValueError, 'no executable file named %s found in search path' % (program,)

Пример использования:

>>> which('ls')
'/bin'
>>> which('foo')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in which
ValueError: no executable file named foo found in search path
0 голосов
/ 26 сентября 2011

Работает ли это, если вместо этого вы используете communicate? Смотрите это предупреждение:

Внимание

Используйте функцию connect () вместо .stdin.write, .stdout.read или .stderr.read, чтобы избежать взаимных блокировок из-за любого другого канала ОС заполнение и блокировка буферов дочернего процесса.

Кроме того, возможно ли, что ваш скрипт работает под другим PATH, чем ваша оболочка? Дамп os.environ["PATH"] и проверка.

0 голосов
/ 26 сентября 2011

Хммм, похоже, дамп класса не существует (в PATH, используемом вашим интерпретатором python)

...