2014-04-16 15 views
5

Tôi đang cố gắng viết một tập lệnh python trả về một giá trị mà sau đó tôi có thể chuyển sang tập lệnh bash. Thing là tôi muốn một giá trị singe trở lại trong bash, nhưng tôi muốn có một vài điều in đến các thiết bị đầu cuối trên đường đi.lấy tập lệnh python để in tới thiết bị đầu cuối mà không quay trở lại như một phần của stdout

Đây là tập lệnh mẫu. Hãy gọi nó là return5.py:

#! /usr/bin/env python 
print "hi" 
sys.stdout.write(str(5)) 

những gì tôi muốn là để có điều này thực hiện theo cách này khi tôi chạy nó từ dòng lệnh:

~:five=`./return5.py` 
hi 
~:echo $five 
5 

nhưng những gì tôi nhận được là:

~:five=`./return5.py` 
~:echo $five 
hi 5 

Nói cách khác, tôi không biết làm thế nào để có một tập lệnh python in và xóa stdout, sau đó gán nó cho giá trị cụ thể mà tôi muốn.

+0

Tôi nhầm lẫn - bạn nghĩ thiết bị đầu cuối IS là gì, nếu không phải là thiết bị đầu cuối? Nếu bạn chỉ cần chúng trên các dòng riêng biệt có thể sử dụng 'import sys; sys.stdout.flush() ' –

+0

là những gì bạn sẽ được returing để shell luôn luôn sẽ là một số? bạn có thể sử dụng 'sys.exit (5)' và nhìn vào '$?'nhưng đây cũng là hành vi không tiêu chuẩn – Doon

+0

Các mã thoát số không phải là" hành vi không chuẩn "theo bất kỳ nghĩa nào - đó là một khái niệm được thiết lập rất tốt. Một số môi trường có thể hạn chế phạm vi, mặc dù (chẳng hạn như 0-127). –

Trả lời

8

Không chắc chắn tại sao @yorodm gợi ý không sử dụng stderr . Đó là lựa chọn tốt nhất tôi có thể nghĩ đến trong trường hợp này.

Lưu ý rằng print sẽ tự động thêm dòng mới, nhưng khi bạn sử dụng sys.stderr.write, bạn cần phải bao gồm một chính mình với "\n".

#! /usr/bin/env python 
import sys 


sys.stderr.write("This is an important message,") 
sys.stderr.write(" but I dont want it to be considered") 
sys.stderr.write(" part of the output. \n") 
sys.stderr.write("It will be printed to the screen.\n") 

# The following will be output. 
print 5 

Sử dụng kịch bản này trông như thế này:

bash$ five=`./return5.py` 
This is an important message, but I dont want it to be considered part of the output. 
It will be printed to the screen. 
bash$ echo $five 
5 

này hoạt động vì nhà ga được thực sự hiển thị cho bạn ba dòng thông tin: stdout, stdinstderr. Cú pháp `cmd` nói" chụp stdout từ quá trình này ", nhưng nó không ảnh hưởng đến những gì xảy ra với stderr. Điều này được thiết kế chính xác cho mục đích bạn đang sử dụng nó - truyền thông tin về lỗi, cảnh báo hoặc những gì đang diễn ra trong quá trình.

Có thể bạn chưa nhận ra rằng stdin cũng được hiển thị trong thiết bị đầu cuối vì đó chỉ là những gì hiển thị khi bạn nhập. Nhưng nó sẽ không phải như vậy. Bạn có thể tưởng tượng gõ vào thiết bị đầu cuối và không có gì hiển thị. Trong thực tế, điều này là chính xác những gì sẽ xảy ra khi bạn gõ vào một mật khẩu. Bạn vẫn đang gửi dữ liệu đến stdin nhưng thiết bị đầu cuối không hiển thị dữ liệu đó.

0

Bạn có thể sử dụng thiết bị xuất chuẩn để xuất thông điệp của bạn và stderr để nắm bắt các giá trị trong bash. Thật không may đây là một số hành vi kỳ lạ như stderr là dành cho các chương trình để giao tiếp thông báo lỗi vì vậy tôi mạnh mẽ khuyên bạn chống lại nó.

OTOH bạn luôn có thể xử lý đầu ra kịch bản của bạn trong bash

2

từ nhận xét của tôi ..

#!/usr/bin/env python 
#foo.py 

import sys 
print "hi" 
sys.exit(5) 

sau đó sản lượng

[~] ./foo.py 
hi 
[~] FIVE=$? 
[~] echo $FIVE 
5 
Các vấn đề liên quan