File: rpyclient.py

package info (click to toggle)
rpy2 3.6.4-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,412 kB
  • sloc: python: 18,448; ansic: 492; makefile: 197; sh: 166
file content (47 lines) | stat: -rw-r--r-- 1,298 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import socket
import sys
import locale
import argparse


def send_R_code(rcode, hostname, port):
    """
    Evaluate the R code in `rcode` (on a possibly remote machine)
    """
    # Create a socket (SOCK_STREAM means a TCP socket)
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # Connect to server and send data
    sock.connect((hostname, port))
    size_send = len(rcode).to_bytes(8, 'little')
    sock.send(bytes(encoding, 'ASCII') + b'\n' + \
              size_send + \
              rcode)

    # Receive data from the server and shut down
    print("Received:")
    size = int.from_bytes(sock.recv(8), 'little') # 64 bits max
    print("    size: %i bytes" % size)
    received = sock.recv(size)
    sock.close()
    print("    R output:")
    print(str(received, encoding))


if __name__ == '__main__':
    
    parser = argparse.ArgumentParser()
    parser.add_argument('-p', '--port',
                        type=int,
                        default=8080)
    parser.add_argument('--hostname',
                        default='localhost')
    
    options = parser.parse_args()

    # read R code from STDIN
    rcode = sys.stdin.read()
    encoding = locale.getlocale()[1]
    rcode = bytes(rcode, encoding)

    send_R_code(rcode, options.hostname, options.port)