os.system () выполнить команду под какой оболочкой linux? - PullRequest
9 голосов
/ 25 мая 2009

Я использую / bin / tcsh в качестве оболочки по умолчанию.

Однако команда os.system в стиле tcsh ('setenv VAR val') у меня не работает. Но os.system ('export VAR = val') работает.

Итак, мой вопрос: как мне узнать команду запуска os.system (), под какой оболочкой?

Ответы [ 4 ]

10 голосов
/ 02 февраля 2013

просто читал Выполнение BASH из Python , затем 17.1. подпроцесс - управление подпроцессом - документация Python v2.7.3 , и я увидел аргумент executable; и похоже на работу:

$ python
Python 2.7.1+ (r271:86832, Sep 27 2012, 21:16:52) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> print os.popen("echo $0").read()
sh
>>> import subprocess
>>> print subprocess.call("echo $0", shell=True).read()
/bin/sh
>>> print subprocess.Popen("echo $0", stdout=subprocess.PIPE, shell=True).stdout.read()
/bin/sh
>>> print subprocess.Popen("echo $0", stdout=subprocess.PIPE, shell=True, executable="/bin/bash").stdout.read()
/bin/bash
>>> print subprocess.Popen("cat <(echo TEST)", stdout=subprocess.PIPE, shell=True).stdout.read()
/bin/sh: Syntax error: "(" unexpected
>>> print subprocess.Popen("cat <(echo TEST)", stdout=subprocess.PIPE, shell=True, executable="/bin/bash").stdout.read()
TEST

Надеюсь, это кому-нибудь поможет,
Ура!

9 голосов
/ 25 мая 2009

В эти дни вы должны использовать модуль Подпроцесс вместо os.system(). Согласно документации, оболочка по умолчанию - /bin/sh. Я считаю, что os.system() работает так же.

Редактировать: я должен также упомянуть, что модуль подпроцесса позволяет вам устанавливать среду, доступную для выполняющегося процесса, через параметр env.

5 голосов
/ 25 мая 2009

os.system() просто вызывает системный вызов system() ("man 3 system"). На большинстве * никс это означает, что вы получаете /bin/sh.

Обратите внимание, что export VAR=val технически не является стандартным синтаксисом (хотя bash понимает его, и я думаю, ksh тоже понимает). Он не будет работать в системах, где /bin/sh на самом деле является оболочкой Борна. На этих системах вам нужно экспортировать и установить как отдельные команды. (Это также будет работать с bash.)

2 голосов
/ 25 мая 2009

Если ваша команда является файлом оболочки, и файл является исполняемым, и файл начинается с "#!", Вы можете выбрать свою оболочку.

#!/bin/zsh
Do Some Stuff

Вы можете написать этот файл и затем выполнить его с помощью subprocess.Popen(filename,shell=True), и вы сможете использовать любую оболочку, какую пожелаете.

Кроме того, обязательно прочитайте это о os.system и subprocess.Popen.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...