2010-07-15 5 views
3

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

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

CSH Script (это работает, выполняет Foo):

foo <argument> 

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

os.system("foo <argument>") 

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

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

CSH:

alias foo cp 
foo file1 file2 

Python:

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. Но если есть способ сделать эту работу, не прибегая к этому, я хотел бы узнать об этом.

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

ответ

8

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

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

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

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

Примечание опция -i которая должна заставить CSH читать сценарии запуска.

+0

«Что заставило вас думать, что os.system будет использовать csh?» Невежество? :) Я думал, что он просто передал строку в командной строке. Спасибо за ответ. Это устраняет проблему, с которой я столкнулся, но, к сожалению, поскольку каждый вызов выполняется в своей собственной подоболочке, мне придется найти другое решение. Характер моей команды 'foo' таков, что он загружает кучу других вещей, которые будут использоваться вашим скриптом, поэтому, если этот материал будет потерян, как только закончится команда os.system, это не сработает. –

+1

Он передает материал в командной строке. Это просто, что нет единственного * типа * командной строки;) Если он загружает другие вещи для последующих команд, и вы конвертируете все это в python, возможно, вы должны сначала перенести этот материал на python;) –

0

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

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

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

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

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

  • Нет связанных вопросов^_^