Like this question:How to input arguments after compiling python program with PyInstaller For personal reasons,I need to use scala to start a python HTTP server, and the port needs to be randomly generated and pass to the python program. I need to compile the python program to an executable file first, with all dependencies, so I decided to use pyinstaller.
from http.server import HTTPServer, BaseHTTPRequestHandler
import json
import sys
import numpy as np
from sklearn import neighbors
host = ('localhost', int(sys.argv[1])) # the port is passed here
slide_window = []
class Resquest(BaseHTTPRequestHandler):
def do_POST(self):
content_len = int(self.headers['Content-Length'])
post_body = self.rfile.read(content_len)
update_data = json.loads(post_body)
slide_window.append(update_data)
if len(slide_window) >= 100:
result = regression()
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
self.wfile.write(json.dumps(result).encode())
del slide_window[:11]
else:
self.send_response(200)
empty_data = []
self.send_header('Content-type', 'application/json')
self.end_headers()
self.wfile.write(json.dumps(empty_data).encode())
def regression():
timestamp = np.arange(0,10,0.1).reshape(100,1)
knn = neighbors.KNeighborsRegressor(5, weights="distance")
knn.fit(timestamp, slide_window)
predict_timestamp = np.array(10,11,0.1).reshape(10,1)
result_frequency = knn.predict(predict_timestamp)
return result_frequency
if __name__ == '__main__':
server = HTTPServer(host, Resquest)
server.serve_forever()
When I use like
python3 regressionServer.py 9999
It works fine. But after I used
pyinstaller -F regressionServer.py
it created an executable file in dist directory. I couldn't exec dist/regressionServer 9999
. It told me this error:
> ValueError: invalid literal for int() with base 10: '-B'
So I printed sys.argv
and found that
['/root/github.com/jessestutler/regressionServer/dist/regressionServer', '-B', '-S', '-E', '-s', '-c', 'from multiprocessing.semaphore_tracker import main;main(3)']
The problem is that args are fixed and I can't pass my arguments to the executable file now. How to solve it?