2010-01-14 12 views
9

Các mã sau đây:Cần có các quyền nào đối với tiến trình con.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) 

Nguyên nhân của lỗi này khi gọi dòng cuối cùng ví dụ: 'chuyển đổi =' trong 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 

Tôi đã thử chmod 777 /Users/jondoe/development/mdb-export - những gì khác có thể được yêu cầu?

Trả lời

7

Dường các 'Quyền bị từ chối lỗi' được orginally đến từ Popen cố gắng để thực hiện mdb-xuất khẩu từ vị trí sai (và để ghép những thứ, với các điều khoản sai).

Nếu mdbtools được cài đặt, sau hoạt động tốt và được thừa hưởng các điều khoản chính xác mà không cần sudo, vv

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

(Cần lưu ý, tôi có bản thân mình vào một muddle trong một thời gian, sau khi quên rằng Popen là để mở tập tin thực thi, không phải thư mục hoặc tập tin không exectable trong các thư mục)

Cảm ơn tất cả các câu trả lời của bạn, tất cả đều làm cho việc đọc thú vị bất kể :)

0

Bạn cũng cần đảm bảo quyền đọc và thực thi cho người dùng đang chạy mã đó trên các thư mục trên chuỗi -/Người dùng,/Người dùng/jondoe và/Người dùng/jondoe/phát triển.

+0

tôi đã thực hiện một thư mục/mdb xuất trong root (didn' t thiết lập lạ mắt chmod 777 trên/Người dùng) và chmod'ed nó đến 777. Lỗi tương tự vẫn còn. –

1

Bạn có thể nạp "sudo" vào tiến trình con không? Xem SO thread này.

@ Jon Hadley, từ người phiên dịch:

>>> 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 

Từ Terminal trên OS X, tôi phải làm sudo khi tôi chạy kịch bản:

$ sudo python test.py 

thì đây (trong test.py) cung cấp cùng một kết quả như trước:

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

Bắt quy trình con để xử lý trực tiếp xác thực từ tập lệnh là probabl y không phải là một ý tưởng hay vì nó ẩn đi sự leo thang đặc quyền. Nhưng bạn có thể xem pexpect và SO answer này.

+0

Hãy thử một lần. Có cách nào để xem những gì người dùng quá trình Python của tôi đang chạy như? –

+0

@Jon Hadley >>> os nhập >>> os.getenv ('USER') 'telliott99' – telliott99

11

Giả sử rằng quyền truy cập vào các thư mục mẹ là chính xác (tức là tất cả các thư mục mẹ phải có + x cho phép), thử thêm:

shell=True 

để lệnh Popen như:

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

Nó hoạt động với subprocess.check_output, Cảm ơn! – jedema

+0

đây là vấn đề của tôi, cảm ơn! – Anentropic