2010-01-14 123 views
9

下面的代碼: - 可能需要什麼subprocess.Popen需要什麼權限?

gb = self.request.form['groupby'] 
typ = self.request.form['type'] 
tbl = self.request.form['table'] 

primary = self.request.form.get('primary', None) 

if primary is not None: 
    create = False 
else: 
create = True 

mdb = tempfile.NamedTemporaryFile() 
mdb.write(self.request.form['mdb'].read()) 
mdb.seek(0) 

csv = tempfile.TemporaryFile() 
conversion = subprocess.Popen(("/Users/jondoe/development/mdb-export", mdb.name, tbl,),stdout=csv) 

在OS X打電話時的最後一行,即「轉換=」

Traceback (innermost last): 
    Module ZPublisher.Publish, line 119, in publish 
    Module ZPublisher.mapply, line 88, in mapply 
    Module ZPublisher.Publish, line 42, in call_object 
    Module circulartriangle.mdbtoat.mdb, line 62, in __call__ 
    Module subprocess, line 543, in __init__ 
    Module subprocess, line 975, in _execute_child 
OSError: [Errno 13] Permission denied 

我已經試過chmod 777 /Users/jondoe/development/mdb-export導致這個錯誤?

回答

7

似乎'權限被拒絕的錯誤'最初來自Popen試圖從錯誤的位置執行mdb-export(並以錯誤的權限複合事物)。

如果安裝mdbtools,下面的工作正常,並繼承了正確的權限,而不需要使用sudo等

subprocess.Popen(("mdb-export", mdb.name, tbl,),stdout=csv) 

(值得注意的是,我讓自己陷入到了一段混亂,已經忘記了POPEN是在文件夾中打開可執行文件,沒有文件夾或非exectable文件)

感謝您的回覆,他們都有趣的閱讀使無論:)

0

您還需要確保在鏈上的目錄 -/Users,/ Users/jondoe和/ Users/jondoe/development上運行該代碼的用戶的讀取和執行權限。

+0

我做了根另一個文件夾/ MDB出口(沒」花哨的設置chmod 777 on/Users)並chmod'ed到777.同樣的錯誤仍然存​​在。 – 2010-01-15 07:28:42

1

你可以提供「sudo」到子進程嗎?看到這個SO thread

@喬恩哈德利,從解釋:

>>> import subprocess 
>>> p = subprocess.call(['sudo','/usr/bin/env']) 
PASSWORD: 
[snip] 

USER=root 
USERNAME=root 
SUDO_COMMAND=/usr/bin/env 
SUDO_USER=telliott99 
SUDO_UID=501 
SUDO_GID=20 

從在OS X上的終端,我要做的須藤當我運行該腳本:

$ sudo python test.py 

那麼這(在test.py )給出與以前相同的輸出:

import subprocess 
p = subprocess.Popen('/usr/bin/env') 

獲取子進程直接處理腳本的身份驗證是probabl你不是一個好主意,因爲它隱藏了特權升級。但你可以看看pexpect和這個SO answer

+0

試一試。有沒有辦法查看我的Python進程正在運行的用戶? – 2010-01-18 16:49:35

+0

@Jon Hadley >>> import os >>> os.getenv('USER') 'telliott99' – telliott99 2010-01-18 17:49:42

11

假設在父文件夾的權限是正確的(即所有父文件夾應該有+ X許可),試着加入:

shell=True 

到POPEN命令,例如:

subprocess.Popen(("/Users/jondoe/development/mdb-export", mdb.name, tbl,), stdout=csv, shell=True) 
+0

它適用於subprocess.check_output,謝謝! – jedema 2015-09-04 10:01:09

+0

這是我的問題,謝謝! – Anentropic 2016-02-15 10:44:51

相關問題