2009-05-25 25 views
9

Tôi đang sử dụng/bin/tcsh làm shell mặc định của mình.os.system() thực hiện lệnh dưới vỏ linux nào?

Tuy nhiên, lệnh kiểu tcsh os.system ('setenv VAR val') không hoạt động đối với tôi. Nhưng os.system ('export VAR = val') hoạt động.

Vì vậy, câu hỏi của tôi là làm thế nào tôi có thể biết lệnh os.system() chạy theo trình bao nào?

Trả lời

5

os.system() chỉ cần gọi system() cuộc gọi hệ thống ("man 3 system"). Trên hầu hết các * nixes, điều này có nghĩa là bạn nhận được /bin/sh.

Lưu ý rằng export VAR=val về mặt kỹ thuật không phải cú pháp chuẩn (mặc dù bash hiểu nó và tôi nghĩ rằng ksh cũng vậy). Nó sẽ không hoạt động trên các hệ thống nơi mà /bin/sh thực sự là vỏ Bourne. Trên các hệ thống đó, bạn cần xuất và đặt làm các lệnh riêng biệt. (Điều này cũng sẽ hoạt động với bash.)

9

Những ngày này bạn nên sử dụng mô-đun Subprocess thay vì os.system(). Theo tài liệu ở đó, vỏ mặc định là /bin/sh. Tôi tin rằng os.system() hoạt động theo cùng một cách.

Chỉnh sửa: Tôi cũng nên đề cập đến mô-đun quy trình con cho phép bạn đặt môi trường có sẵn cho quy trình thực hiện thông qua tham số env.

+0

Thật vậy,/bin/sh (hầu như luôn luôn là một dạng vỏ bourne) hầu như luôn có ý nghĩa gì khi bất cứ điều gì * nix liên quan nói "vỏ" mà không có trình độ chuyên môn. Nó cũng có thể hữu ích để lưu ý rằng nếu bạn thực sự cần phải thực thi một số đoạn mã trong một shell không bourne cụ thể, bạn có thể truyền hàm như '/ path/to/tcsh -c' đoạn mã tcsh của bạn ở đây ''. –

2

Nếu lệnh của bạn là tệp vỏ và tệp có thể thực thi và tệp bắt đầu bằng "#!", Bạn có thể chọn trình bao.

#!/bin/zsh 
Do Some Stuff 

Bạn có thể viết tệp này và sau đó thực hiện với subprocess.Popen(filename,shell=True) và bạn sẽ có thể sử dụng bất kỳ trình bao nào bạn muốn.

Ngoài ra, hãy nhớ đọc this về os.systemsubprocess.Popen.

+0

tôi sẽ chỉ ra rằng shell = True là không cần thiết, nhưng sau đó nó xảy ra với tôi: là nó là vỏ có trách nhiệm giải thích shebangs và hành động cho phù hợp? –

+0

Chính xác. Trình dịch diễn giải byte "ma thuật" "#!" để xem những gì vỏ khác thực sự nên sử dụng tập tin này. –

10

Chỉ đọc Executing BASH from Python, sau đó 17.1. subprocess — Subprocess management — Python v2.7.3 documentation và tôi đã thấy đối số executable; và có vẻ như để làm việc:

$ 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 

Hope this helps ai đó,
Cheers!

+0

Tôi là ai đó. Đây là những gì tôi đang tìm kiếm. Cảm ơn bạn đã lưu ý điều này :) – Thorn

+0

Vâng, điều này đúng như vậy khi một đường ống xuất phát từ một lệnh duy nhất tới nhiều lệnh bằng cách sử dụng tee, một cái gì đó như 'command out = stdout | tee> (command_1 in = stdin)> (lệnh_2 in = stdin) '. Cảm ơn bạn đã đăng bài này, hãy chú ý ~ – CheeHow

Các vấn đề liên quan