allows you to fix port; deprecates server_port, server_name parameters in Interface()

This commit is contained in:
Abubakar Abid 2021-12-17 10:43:11 -06:00
parent 8d23f067a2
commit 9d54d13d54
3 changed files with 27 additions and 23 deletions

View File

@ -63,9 +63,8 @@ class Interface:
examples_per_page=10, live=False, layout="unaligned", show_input=True, show_output=True,
capture_session=None, interpretation=None, num_shap=2.0, theme=None, repeat_outputs_per_model=True,
title=None, description=None, article=None, thumbnail=None,
css=None, server_port=None, server_name=None, height=500, width=900,
allow_screenshot=True, allow_flagging=None, flagging_options=None, encrypt=False,
show_tips=None, flagging_dir="flagged", analytics_enabled=None, enable_queue=None, api_mode=None):
css=None, height=500, width=900, allow_screenshot=True, allow_flagging=None, flagging_options=None,
encrypt=False, show_tips=None, flagging_dir="flagged", analytics_enabled=None, enable_queue=None, api_mode=None):
"""
Parameters:
fn (Callable): the function to wrap an interface around.
@ -162,12 +161,7 @@ class Interface:
"Examples argument must either be a directory or a nested list, where each sublist represents a set of inputs.")
self.num_shap = num_shap
self.examples_per_page = examples_per_page
self.server_name = server_name
self.server_port = server_port
if server_name is not None or server_port is not None:
warnings.warn("The server_name and server_port parameters in the `Interface` class will be deprecated. Please provide them in the `launch()` method instead.")
self.simple_server = None
self.allow_screenshot = allow_screenshot
# For allow_flagging and analytics_enabled: (1) first check for parameter, (2) check for environment variable, (3) default to True
@ -573,7 +567,6 @@ class Interface:
path_to_local_server (str): Locally accessible link
share_url (str): Publicly accessible link (if share=True)
"""
# Set up local flask server
config = self.get_config_file()
self.config = config
@ -589,8 +582,8 @@ class Interface:
getpass.getpass("Enter key for encryption: "))
# Store parameters
server_name = server_name or self.server_name or networking.LOCALHOST_NAME
server_port = server_port or self.server_port or networking.INITIAL_PORT_VALUE
server_name = server_name or networking.LOCALHOST_NAME
server_port = server_port
if self.enable_queue is None:
self.enable_queue = enable_queue
@ -696,17 +689,19 @@ class Interface:
return app, path_to_local_server, share_url
def close(self):
def close(self, verbose=True):
"""
Closes the Interface that was launched. This will close the server and free the port.
"""
try:
if self.share_url:
requests.get("{}/shutdown".format(self.share_url))
print("Closing Gradio server on port {}...".format(self.server_port))
if verbose:
print("Closing Gradio server on port {}...".format(self.server_port))
elif self.local_url:
requests.get("{}shutdown".format(self.local_url))
print("Closing Gradio server on port {}...".format(self.server_port))
if verbose:
print("Closing Gradio server on port {}...".format(self.server_port))
else:
pass # server not running
except (requests.ConnectionError, ConnectionResetError):
@ -751,9 +746,9 @@ class Interface:
utils.integration_analytics(data)
def close_all():
def close_all(verbose=True):
for io in Interface.get_instances():
io.close()
io.close(verbose)
def reset_all():

View File

@ -32,7 +32,7 @@ from werkzeug.security import safe_join
INITIAL_PORT_VALUE = int(os.getenv(
'GRADIO_SERVER_PORT', "7860")) # The http server will try to open on port 7860. If not available, 7861, 7862, etc.
TRY_NUM_PORTS = int(os.getenv(
'GRADIO_NUM_PORTS', "100")) # Number of ports to try before giving up and throwing an exception.
'GRADIO_NUM_PORTS', "1000")) # Number of ports to try before giving up and throwing an exception.
LOCALHOST_NAME = os.getenv(
'GRADIO_SERVER_NAME', "127.0.0.1")
GRADIO_API_SERVER = "https://api.gradio.app/v1/tunnel-request"
@ -426,10 +426,20 @@ def queue_thread(path_to_local_server, test_mode=False):
break
def start_server(interface, server_name, server_port, auth=None, ssl=None):
port = get_first_available_port(
server_port, server_port + TRY_NUM_PORTS
)
def start_server(interface, server_name, server_port=None, auth=None, ssl=None):
if server_port is None: # if port is not specified, start at 7860 and search for first available port
port = get_first_available_port(
INITIAL_PORT_VALUE, INITIAL_PORT_VALUE + TRY_NUM_PORTS
)
else:
try:
s = socket.socket() # create a socket object
s.bind((LOCALHOST_NAME, server_port)) # Bind to the port to see if it's available (otherwise, raise OSError)
s.close()
except OSError:
raise OSError("Port {} is in use. If a gradio.Interface is running on the port, you can close() it or gradio.close_all().".format(server_port))
port = server_port
url_host_name = "localhost" if server_name == "0.0.0.0" else server_name
path_to_local_server = "http://{}:{}/".format(url_host_name, port)
if auth is not None:

View File

@ -199,7 +199,6 @@ class TestState(unittest.TestCase):
def test_state_value(self):
io = gr.Interface(lambda x: len(x), "text", "label")
io.launch(prevent_thread_lock=True)
app, _, _ = io.launch(prevent_thread_lock=True)
with app.test_request_context():
networking.set_state("test")