2014-10-29 92 views
5

我有一個應該報告上一個命令成功或失敗的python腳本。目前,我正在做

command && myscript "Success" || myscript "Failed" 

我想這樣做是不是能夠運行斷開鏈接作爲命令:

command; myscript 

而且具有myscript檢索$?,即存在狀態。我知道我可以運行:

command; myscript $? 

但我真正尋找的是一個Python的辦法從蟒蛇$?

任何想法?謝謝!

更新: 由於這是一個奇怪的請求,讓我澄清它來自哪裏。 我有一個python腳本,它使用pushover API向我的手機發送通知。 當我運行一個漫長的過程時,我運行它爲process && notify "success" || notify "failure"。但有時我忘了這麼做,只是運行這個過程。此時,我想在仍處理的命令行上運行「notify」,並讓它獲取退出狀態並通知我。 當然,我也可以在bash中實現pushover API調用,但是現在已經成爲了解如何在python中執行此操作的問題

+1

你嘗試通過call()或者其他方法來顯示'run''$?'嗎? – 4rlekin 2014-10-29 09:34:13

+1

這是一個非常好的問題。我一直在尋找,到目前爲止還沒有發現任何東西。你可以做'命令; SOMEVAR = $ ?; myscript',然後在你的腳本中檢索'os.environ [「SOMEVAR」]',但這並不比執行'command; myscript $?'。如果我找到任何東西,我會回答一個答案。 – rmunn 2014-10-29 09:43:25

+0

@ 4rlekin好主意,但它似乎沒有工作。 'print subprocess.call(「/ bin/echo $?」,shell = True)'總是返回0.我懷疑這是因爲該命令是在一個不知道其祖父母的外殼存在狀態的新外殼中執行的bash運行python,運行bash) – Miquel 2014-10-29 09:48:51

回答

2

這可能是不可能的,因爲腳本(任何語言,只是Python)得到執行。試試這個:創建一個包含以下內容稱爲retcode.sh shell腳本:

#!/bin/bash 
echo $? 

使其可執行文件,然後嘗試在shell提示符下輸入:

foo # Or any other non-existent command 
echo $? # prints 127 
foo 
./retcode.sh # prints 0 

我必須仔細檢查該,但似乎所有腳本(不僅僅是Python腳本)都在單獨的進程中運行,該進程無法訪問由「父級」shell進程運行的先前命令的退出代碼。這可以解釋爲什麼Python沒有(據我所知)給你一種方法來檢索前一個命令的退出代碼,比如bash的$? - 因爲它總是0,不管怎樣。

我相信你做command; myscript $?的方法是實現你想要做的最好的方法:讓Python腳本知道上一步的退出代碼。

更新:看到你正在試圖做你的澄清後,我想你最好的選擇將是修改notify腳本只是一點點,以便它可以像-s--status一個選項(使用當然)),並基於狀態碼發送消息(如果代碼爲0,則爲「成功」,如果是別的,則爲「失敗NN」,其中NN爲實際代碼)。然後當你輸入command沒有你的小&& notify "success" || notify "failure"技巧時,它仍然在運行,你可以輸入notify -s $?並獲得你正在尋找的通知,因爲這將是你的shell在command返回後運行的下一個東西。

+0

謝謝。是的,你是對的,你的第一個腳本是在自己的bash中運行,不知道父bash的退出狀態。這隻有在父母bash將'$?'傳遞給孩子的情況下才有效,而不是。我希望Python可能會拿起價值。這將是可能的,但似乎沒有完成。它相當於:'command; python $? script'其中'$?'是可通風口裏面的腳本 – Miquel 2014-10-29 10:08:08

+1

你可以告訴shell在當前shell通過在前面使用點運行命令。如。 '。 ./foo'。如果沒有前面的點,它會產生一個子shell來運行命令 – Doon 2014-10-29 10:31:15

+0

@Doon好點,這對於bash腳本是相互連接的。我無法獲取('.')python – Miquel 2014-10-29 10:37:17

1

但我真正想要的是一種蟒蛇的方式來檢索$?來自python。

如果你把它們分別作爲分開個進程,那顯然是不可能的。

一個獨立的進程無法知道另一個進程是如何結束的。

您可以1)存儲在文件中的結果,2)發射從command東西,它管的腳本3)從myscript運行命令,等等...但你需要某種通信

最簡單的方法,當然是command; myscript $?

+0

我理解這個過程的分離,但我一直在尋找渺茫的機會,蟒蛇拿起'$?'自身並使其提供給我scripy。猜猜並非如此。謝謝澄清! – Miquel 2014-10-29 10:04:34

2
false; export ret=$?; ./myscript2.py 

myscript2.py:

#!/usr/bin/python 

import os 
print os.environ['ret'] 

輸出:

1 
+0

感謝您的回答。儘管我在這個問題上試圖暗示這一點。雖然你的解決方案可以工作,但現在已經退化爲在沒有任何顯式參數傳遞的情況下從python獲取'$?'的非常挑剔的論點。儘管如此,兩個好的解決方案!謝謝 – Miquel 2014-10-29 10:39:10

+0

我已經刪除了第一個答案。 – Cyrus 2014-10-29 18:01:24

1

這顯然是不可能:退出值一個進程只能通過它的父進程訪問,並且沒有shell知道提供一個API以允許下一個進程檢索它。

恕我直言,什麼是更貼近您的需求將是:

process 
myscript $? 

這樣的話,你可以做到這一點,即使你開始你不假思索通知過程。

您還可以使腳本能夠運行進程獲取退出代碼及其通知,或者(取決於命令行中給出的選項)使用退出代碼作爲參數。例如,你可以有:

  • myscript process:運行process並執行通知
  • myscript -c $?:只做通知

​​模塊可以讓那麼容易。

相關問題