2011-06-12 22 views
1
非交互式的使用

我調用CMD在Python這樣的:/bin/sh的 - 從Python的

subpocess.Popen(['coffee'], shell=True) 

我相信的是翻譯成:

/bin/sh -c "coffee" 

從文檔我已閱讀,在像/ etc/profile,/etc/bash.bashrc這樣的非交互式模式文件不會被讀取,並使用默認的$ PATH(init $ PATH)。我對嗎?是否有將咖啡添加到$ PATH的唯一方法是將其複製到/ usr/local/bin?

回答

2

不,shell將繼承Python解釋器中的PATH,即它將是os.getenv('PATH')。此外,您還可以在命令中設置路徑:

subprocess.Popen(['PATH=/where/ever/bin:$PATH coffee'], shell=True) 

但我真的建議你要麼使用的完整路徑coffee,或執行你的Python程序之前設置PATH

+1

爲一個命令設置環境變量的更好方法是使用'subprocess.Popen'的'env'參數。即使你不涉及shell也是有效的(畢竟,這通常是一個壞主意。) – 2011-06-12 19:36:51

+0

@Thomas:是的,'env'會更好,也許OP不應該使用'shell =真正的「。 – 2011-06-12 20:20:28

+0

謝謝,我最終將咖啡全局安裝到/ usr/local/bin,因爲我不想在Python中硬編碼PATH。 – 2011-06-13 15:26:33

2

從歷史上看,對於作爲非交互式命令調用的shell,沒有啓動文件被讀取,因爲大概已經設置了環境。

Python,shell,事實上幾乎所有東西都會通過現有環境或至少將環境變量傳遞給子shell,因此,您已經執行了.profile或bash擴展。 (因爲它是在用戶登錄等工藝繼承了經修改的路徑運行)

選項您有:

  • 指定爲所有系統用戶的路徑/etc/profile
  • 需要從適當的路徑設置用戶(你繼承他們)
  • 運行子公用事業完整路徑
  • 把所有的命令在目錄已經在PATH
+0

謝謝/ upvoted。被接受的牧師回答,因爲他的名譽較低:) – 2011-06-13 15:28:40