2017-06-22 32 views
1

您好,我正在嘗試從我的pythons腳本中提取check.setup文件。 代碼無法從python shell腳本獲取bash文件

import os 
os.system("source /fullpathhere/check.setup") 

它說沒有找到命令。令人驚訝的是,我可以直接從shell獲取相同的文件。 check.setup是csh文件。它正在尋找其他.csh文件並設置了很少的環境變量,我在這裏看到了很少的答案,但沒有人能解決這個問題。 PS:我試圖寫bash文件而不是python。我也嘗試使用subprocess.Popen。問題依然存在。 Aashish

+1

我不確定這種可能性是否正確(因此評論未回答),但我聽說有時'source'實際上是'.'的別名。看看是否值得。/fullpathhere/check.setup'作爲您的命令。 – Delioth

+0

機器上的默認外殼是什麼?用'echo $ SHELL'查看它,然後直接在你的控制檯上測試你的'source/fullpath/check.setup'這個命令來查看結果。 – glegoux

+5

源和。是內置的shell命令,而不是你可以像這樣執行的東西。但即使可以,也沒有任何意義,因爲os.system產生了一個子shell:在子shell中設置的任何env vars在命令返回時會立即丟失。 –

回答

0

使用POPEN

subprocess.Popen('source ./fullpathhere/check.setup', shell=True) 
+0

嘿,我用過Popen。 (有點)。來自子流程導入調用。然後調用('source ./fullpath/check.setup',shell = True)。它沒有工作。同樣的問題 –

+0

'源'是一種抨擊;在POSIX sh中工作時,它需要'。' –

+0

,儘管在這一點上,使用'source'或'。'而不是'subprocess.Popen(['sh',' ./fullpathhere/check.setup'])'(替換一個替代解釋器,如果更喜歡),根本沒有任何'shell'參數。 –

0

爲什麼沒有標記您的帖子如CSH,即使你明確提到CSH在你的問題....

沒有可執行namend 來源(你可以通過輸入bin/which source來驗證它。你自己指出,這應該是由csh完成的,但Python應該如何知道它需要調用c噓,如果你不告訴它?

我沒有我的系統上CSH,但如果我的時間的幾十年前,在這裏我確實是用來CSH編程記錯的話,你可以這樣做

os.system("csh -c fullpathhere/check.setup") 

其實,我也會指定-f標誌來跳過.cshrc,除非你真的需要這個來源。

+0

鑑於'system()'是如何實現的,你告訴OP運行'sh -c「csh -c fullpathhere/check.setup」'。那真是非常愚蠢。 –

+0

感謝您對標籤的建議。我現在添加了。我無法準確找到cshell。我試過這樣做,但問題是我沒有權限訪問該文件。我甚至沒有授權使用chmod進行許可。所以我從python腳本製作了另一個csh文件,並從中找到了我的check.setup。我可以授予我在創建時從python腳本創建的文件的權限。然後我從python執行我的csh文件 –

+0

@Charles Duffy:在這種情況下,Python不夠聰明以省略'sh'過程(因爲Perl會在這種情況下)?但即使創建了一個額外的POSIX shell進程來運行C-Shell,我並不認爲它很糟糕(考慮到使用'os.system'方便)。 – user1934428