This can be done with sockets,
using the following examples you can run from the command line:
From the first terminal:
blender --python blender_server.py
From a second terminal:
python blender_client.py /path/to/myscript.py
This will execute /path/to/myscript.py
in the first Blender instance.
You can send multiple scripts or run the client multiple times.
Note that this is a simple example, to get return codes in the client or make the port configurable... etc, this would have to be extended.
It could even be made to sent the entire script, or compressed Python byte-code over a network, none of this is especially hard. It just depends what you're after.
blender_server.py
# Script to run from blender:
# blender --python blender_server.py
PORT = 8081
HOST = "localhost"
PATH_MAX = 4096
def execfile(filepath):
import os
global_namespace = {
"__file__": filepath,
"__name__": "__main__",
}
with open(filepath, 'rb') as file:
exec(compile(file.read(), filepath, 'exec'), global_namespace)
def main():
import socket
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind((HOST, PORT))
serversocket.listen(1)
print("Listening on %s:%s" % (HOST, PORT))
while True:
connection, address = serversocket.accept()
buf = connection.recv(PATH_MAX)
for filepath in buf.split(b'\x00'):
if filepath:
print("Executing:", filepath)
try:
execfile(filepath)
except:
import traceback
traceback.print_exc()
if __name__ == "__main__":
main()
blender_client.py
#!/usr/bin/env python
# Script to send paths to run in blender:
# blender_client.py script1.py script2.py
PORT = 8081
HOST = "localhost"
def main():
import sys
import socket
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect((HOST, PORT))
for arg in sys.argv[1:]:
clientsocket.sendall(arg.encode("utf-8") + b'\x00')
if __name__ == "__main__":
main()