2013-09-22 39 views
0

我試圖運行在python子進程,但我得到的錯誤信息: OSERROR:[錯誤13]許可被拒絕OSERROR:[錯誤13]許可被拒絕的Python subprocess.call()

cp2 = cp2.lstrip("~") 
cp2 = wilixdirectory+"/Users/"+loggedusr+cp2 
    if cp3 == None: 
    subprocess.call([cp2]) 
else: 
    subprocess.call([cp2, cp3]) 

CP2和CP3是用於目錄的用戶輸入

wilixdirectory是目錄

loggedusr是像「鮑勃」或「喬」的字符串

代碼運行寧出來的Unix

+0

你能*顯示*你的代碼?這是什麼環境,有什麼權限? – user2357112

+0

代碼有問題 –

+0

檢查'cp2'的值。這是你期望的嗎?它是否缺少一個主要的斜線,還是它沒有一個應該是的?如果它命名了一個真實文件,您是否有權限訪問該文件? – user2357112

回答

1

而是假設路徑開始於一個斜槓,並使用+串聯,用os.path.join()創建路徑:

import os.path 

basepath = os.path.join(wilixdirectory, 'Users', loggedusr) 
cp2 = cp2.lstrip('~/') 
cp2 = os.path.abspath(os.path.join(basepath, cp2)) 
if not cp2.startswith(basepath + os.path.pathsep): 
    # something is wrong still, the absolute final path is not inside of 
    # user directory, bail now. 
    raise ValueError('Not a valid command') 

# Perhaps test if os.path.isfile(cp2) is True? 

args = [cp2] 
if cp3 is not None: 
    args.append[cp3] 

subprocess.call(args) 

注意,我剝~,並/cp2開始要從用戶輸入中刪除任何意外的起始字符,請使用os.path.abspath()確保路徑是規範路徑,並解決任何./../條目。你需要然後需要驗證最終結果仍然在用戶的目錄中,而不是在它之外。

您可以使用os.path.isfile()進行測試,以確定cp2路徑在運行subprocess.call()之前是否實際指向實際文件。

0

解決方案:

這會爲Linux,但在Unix工作:

subprocess.call(["open","-a",cp2]) 

的Windows:

subprocess.call(["start",cp2]) 
+0

你也可以檢查'webbrowser.open(cp2)'是否在你的情況下做了正確的事情。 – jfs

相關問題