Преодоление ограничения os.system () в Python 2.3 - PullRequest
3 голосов
/ 15 июля 2010

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

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

CSH Script (работает, выполняет 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.

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

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

Ответы [ 2 ]

8 голосов
/ 15 июля 2010

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

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

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

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

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

0 голосов
/ 15 июля 2010

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

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

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

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

...