回答
在Linux中,你可以使用PROCFS:
>>> os.readlink('/proc/%d/exe' % os.getppid())
'/bin/bash'
os.getppid()
返回父進程的PID。這是便攜式的。但獲取進程名稱不能以便攜方式完成。您可以解析所有單位都可用的輸出ps
,例如與psutil。
謝謝,這是第一個工作答案!此外,這是奇妙的隱晦:) – 2009-09-29 13:46:50
我寧願一個解決方案適用於所有unices,但。 – 2009-09-29 13:47:56
我已經添加了一些提示,使其更便於攜帶。 – 2009-09-29 14:11:10
使用os.system( 「回聲$ 0」)
這完美的作品在我的系統:
cat shell.py:
#!/ms/dist/python/PROJ/core/2.5/bin/python
import os
print os.system("echo $0")
bash-2.05b$ uname -a
Linux pi929c1n10 2.4.21-32.0.1.EL.msdwhugemem #1 SMP Mon Dec 5 21:32:44 EST 2005 i686 athlon i386 GNU/Linux
pi929c1n10 /ms/user/h/hirscst 8$ ./shell.py
/bin/ksh
pi929c1n10 /ms/user/h/hirscst 9$ bash
bash-2.05b$ ./shell.py
/bin/ksh
bash-2.05b$
這是不正確的,因爲它啓動一個新的shell,它沒有給出有關「調用」shell的任何信息。 – 2009-09-29 13:28:23
這不會返回shell的名稱,它會將它打印到屏幕上。至少在我的系統中,無論我從哪個shell調用python,這總是會打印'sh'。 – sepp2k 2009-09-29 13:29:45
嗯,這將啓動一個subhell與同一個shell可執行,腳本被稱爲! – ennuikiller 2009-09-29 13:32:21
你不能在一個可靠的自動化的方式做到這一點。
環境變量可能會引起誤解(用戶可以惡意切換它們)。大多數自動shell變量不是「泄漏」的,即它們只能在shell進程中看到,而不能在子進程中看到。
你可以找出你的父PID,然後搜索該ID的進程列表。如果您在後臺運行,則不起作用(在這種情況下,PPID始終爲1)。
用戶可以從腳本中啓動程序。在這種情況下哪個殼是正確的?腳本啓動的地方還是腳本的shell?
其他程序可以使用系統調用來運行腳本。在這種情況下,你會得到他們的外殼或者什麼也沒有。
如果你有在用戶的環境絕對的控制權,然後把一個變量在他們的個人資料(檢查是否有bash和ZSH手冊的文件,該文件是總是在啓動時。IIRC閱讀,這.profile
的BASH )。
[編輯]創建一個爲兩個shell調用的別名。在別名中,使用
env SHELL_HINT="x$BASH_VERSION" your_script.py
這應該評估爲「x」zsh和別的東西bash。
嗯,它不會,不管你抱怨多少:)在Unix上,進程意味着孤立。他們通常不會將東西泄漏到子流程中,除非您特別告訴他們,而且彈殼特別保守。 – 2009-09-29 13:54:45
import os
shell = os.getenv('SHELL')
如果腳本未從系統shell執行,則這不起作用。 – 2009-09-29 13:54:13
不是特別可靠,但很簡單,並不是錯誤。 :-) – 2009-09-29 13:56:02
@Lennart:並且在OP需要時無法正常工作。 – SilentGhost 2009-09-29 14:03:23
- 1. 你能告訴我這個警告嗎?
- 2. 你能告訴你的代碼在eval塊內嗎?
- 3. highcharts你能告訴你在多大程度上放大了嗎?
- 4. 你能告訴我使用ScheduleThreadPoolExecutor的正確語法嗎?
- 5. 你能告訴我在Phonegap iOS應用程序中的調試過程嗎?
- 6. 我怎麼能告訴你使用Dropzone.js
- 7. 有誰能告訴我這個密碼的名字嗎?
- 8. 你能告訴我正確的語法
- 9. 你能告訴我IExceptionhandler的優點和缺點嗎?
- 10. 你能告訴我這裏「/ g」的含義嗎
- 11. 你能告訴我logback.xml一個完整的模板嗎?
- 12. 你能告訴我以下代碼的錯誤嗎?
- 13. 你能告訴我它是如何工作的嗎? css html
- 14. 你能告訴我這個正則表達式的含義嗎?
- 15. 你能告訴我什麼是錯的嗎?
- 16. 你能告訴我一個好的ADO.NET視頻資源嗎?
- 17. 你能告訴我這個程序是如何工作的嗎?
- 18. 你能告訴SQL Server不要返回特定的行嗎?
- 19. 爲什麼Perl 5在告訴你未初始化值時會告訴你變量的名字?
- 20. 你怎麼能告訴png8從png24
- 21. 你能告訴我這段代碼有什麼問題嗎?
- 22. 你能告訴我爲什麼我要倒退嗎?
- 23. 你能告訴我這個錯誤是什麼意思嗎?
- 24. 你能告訴我diffrence sub和public sub嗎?
- 25. 你能告訴哪個SelectField觸發了一個onChange嗎?
- 26. 紅寶石 - 你能告訴我這裏發生了什麼嗎
- 27. 當你完成這些任務時,你需要告訴智能指針嗎?
- 28. 你問我拉不告訴我你想
- 29. 你好,你能告訴我如何安裝PyQt4到WingiDE
- 30. 告訴shell使用特定python.exe
!?!你爲什麼想要知道? – 2009-09-29 13:52:07
發回可以理解的完成數據。 – 2009-09-29 13:53:36
啊。我的東西os.getenv('SHELL')值得一試。應該在大多數情況下工作(但嘿,誰知道),如果它不存在,請求用戶添加它。 – 2009-09-29 14:03:30