2011-07-14 45 views
9

Tôi có một tập lệnh R tạo một vài ô. Tôi muốn có thể thực thi kịch bản này từ python.thực thi một tập lệnh R từ python

đầu tiên tôi đã cố gắng:

import subprocess 
subprocess.call("/.../plottingfile.R", shell=True) 

này mang lại cho tôi những lỗi sau:

/bin/sh: /.../plottingfile.R: Permission denied 
126 

Tôi không biết những gì các phương tiện số 126. Tất cả các tệp của tôi đều có trên Màn hình nền và do đó tôi không nghĩ rằng bất kỳ quyền đặc biệt nào sẽ là cần thiết? Tôi nghĩ rằng lỗi này có thể đã có một cái gì đó để làm với cwd = none nhưng tôi đã thay đổi điều này và tôi vẫn còn có một lỗi.

Tiếp theo tôi thử như sau:

subprocess.Popen(["R --vanilla --args </.../plottingfile.R>"], shell = True) 

Nhưng điều này quá đã cho tôi một lỗi với:

/bin/sh: Syntax error: end of file unexpected. 

Gần đây nhất tôi đã cố gắng:

subprocess.Popen("konsole | /.../plottingfile.R", shell = True) 

này đã mở một konsole mới cửa sổ nhưng không có tập lệnh R nào được chạy. Ngoài ra, tôi đã nhận được lỗi sau:

/bin/sh: /.../plottingfile.R: Permission denied 

Cảm ơn.

+0

tập lệnh này có hoạt động khi bạn chạy từ dòng lệnh w/o python không? – wespiserA

+0

http://stackoverflow.com/questions/37350886/simple-way-to-pass-directory-to-r-script-using-python/37351221#37351221 – BMW

Trả lời

0

bạn đã thử chmod u+x /pathTo/Rscript.R chưa?

10

Điều đầu tiên trước tiên, hãy đảm bảo rằng bạn có tập lệnh platttingfile.R ở một nơi mà bạn có thể truy cập. Thông thường nó là cùng một thư mục.

Tôi đọc trên internet có một tiện ích gọi là RScript được sử dụng để thực thi R tập lệnh từ dòng lệnh. Vì vậy, để chạy kịch bản bạn sẽ sử dụng python như thế này:

import subprocess 
retcode = subprocess.call(['/path/to/RScript','/path/to/plottingfile.R']) 

Điều này sẽ trả lại retcode 0 sau khi hoàn thành thành công. Nếu plottingfile.R của bạn là trả về một số loại đầu ra, nó sẽ được ném trên STDOUT. Nếu nó kéo lên một số GUI, sau đó nó sẽ đi lên.

Nếu bạn muốn chụp stdout và stderr, bạn làm điều đó như thế này:

import subprocess 
proc = subprocess.Popen(['/path/to/RScript','/path/to/plottingfile.R'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
stdout, stderr = proc.communicate() 

+0

Điều này phù hợp với tôi. Trong [link] sau đây (http://stackoverflow.com/questions/11679936/python-subprocess-arguments), xin vui lòng xem một cách thông minh để lấy một dòng lệnh bình thường và sử dụng split() trên chuỗi để tạo mảng chính xác Popen đang chờ đợi. – jatal

0

một cái gì đó thích công việc này thường cho tôi:

subprocess.Popen("R --vanilla /PATH/plottingfile.R", shell = True) 
3

Shell lỗi 126 là một thực lỗi.

Quyền bị từ chối ngụ ý rằng bạn có "vấn đề về quyền" cụ thể.

Chuyển đến tệp và đảm bảo R/Python có thể truy cập tệp. Tôi sẽ cố gắng thực hiện điều này trước tiên:

$sudo chmod 777 /.../plottingfile.R 

Nếu mã chạy, hãy cho phép đúng nhưng ít có thể truy cập.

Nếu cách này không hiệu quả, hãy thử thay đổi R thành Rscript.

Các vấn đề liên quan