Преодоление ограничения os.system() в Python 2.3

У меня возникла проблема с преобразованием одного из сценариев моей компании из csh в Python. Сценарий csh вызывает команду с псевдонимом, но когда я вызываю ту же команду с псевдонимом через os.system(), она не работает.

Итак, если foo является командой с псевдонимом:

Сценарий CSH (это работает, выполняет foo):

foo <argument>

Python (это не работает, ошибка утверждает, что foo - неизвестная команда):

os.system("foo <argument>")

Я полагаю, что при выполнении скрипта Python должно происходить какое-то переключение контекста, из-за чего Python не имеет доступа к псевдонимам, созданным в оболочке. После прочтения документации кажется, что os.system устаревает в пользу subprocess, и что subprocess имеет параметр shell, который может мне помочь... проблема в том, что я застрял с использованием Python 2.3, а subprocess нет. т доступен до версии 2.4.

У меня возникла идея воспроизвести псевдоним в python. Так, например, скажем, foo был псевдонимом cp.

ЦСХ:

alias foo cp
foo file1 file2

Питон:

os.system("alias foo cp")
os.system("foo file1 file2")

Нет кубиков... здесь тоже ошибки:

sh: line 0: alias: foo: not found
sh: line 0: alias: cp: not found
sh: foo: command not found

Моя последняя попытка — взять несколько строк кода, использующих foo, и поместить их в собственный сценарий CSH, который вызовет Python. Но если есть способ заставить это работать, не прибегая к этому, я хотел бы узнать об этом.

Заранее спасибо!


person Axel Aguado    schedule 15.07.2010    source источник


Ответы (2)


С чего вы взяли, что os.system будет использовать csh? Он использует стандартную систему функций C, которая в системе Unix будет вызывать только базовый /bin/sh. Это будет не csh, а, скорее всего, bash или его более простая версия.

Кстати: обратите внимание, что то, что вы делаете со средой оболочки в os.system, не повлияет на последующие вызовы os.system, потому что каждый из них запускается в другой подоболочке. Другими словами, изменения, внесенные в среду, теряются. И ваш вызов псевдонима не работает, потому что /bin/sh использует другой синтаксис для псевдонимов, чем csh.

Вы можете обойти это, запустив не foo, а что-то вроде:

os.system("/bin/csh -i -c 'foo arg1 arg2'")

Обратите внимание на параметр -i, который должен заставить csh читать сценарии запуска.

person Piotr Kalinowski    schedule 15.07.2010
comment
С чего вы взяли, что os.system будет использовать csh? Невежество? :) Я думал, он просто передал строку в командную строку. Спасибо за ответ. Это устраняет проблему, с которой я столкнулся, но, к сожалению, поскольку каждый вызов выполняется в своей собственной подоболочке, мне придется найти другое решение. Природа моей команды foo такова, что она загружает множество других вещей, которые будут использоваться вашим скриптом, поэтому, если эти вещи будут потеряны, как только команда os.system завершится, она не будет работать. - person Axel Aguado; 15.07.2010
comment
Он передает материал в командную строку. Просто нет единого типа командной строки;) Если он загружает другие вещи для последующих команд, и вы конвертируете все это в python, возможно, вам следует сначала преобразовать эти другие вещи в python. ;) - person Piotr Kalinowski; 15.07.2010

Если вы хотите иметь псевдоним «foo» в Python, выполните псевдоним самостоятельно перед вызовом os.system:

cmd = "foo file1 file2"
foo_alias = "cp"

cmd = re.sub("^foo ", foo_alias + " ", cmd)
os.system(cmd)

Если псевдоним foo более сложный (с заменой аргументов и т. д.), это может быть сложнее.

person Ned Batchelder    schedule 15.07.2010