We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Image opened twice if imagemagick and xv are installed
If ImageMagick and xv are both installed and you call Image.show() it will open the image twice, once with display and once with xv. This is probably related to the for loop over registered viewers. Not sure why the return 1 isn't working though.


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `PIL/ImageShow.py`
Content:
```
1 #
2 # The Python Imaging Library.
3 # $Id$
4 #
5 # im.show() drivers
6 #
7 # History:
8 # 2008-04-06 fl   Created
9 #
10 # Copyright (c) Secret Labs AB 2008.
11 #
12 # See the README file for information on usage and redistribution.
13 #
14 
15 from __future__ import print_function
16 
17 from PIL import Image
18 import os, sys
19 
20 _viewers = []
21 
22 def register(viewer, order=1):
23     try:
24         if issubclass(viewer, Viewer):
25             viewer = viewer()
26     except TypeError:
27         pass # raised if viewer wasn't a class
28     if order > 0:
29         _viewers.append(viewer)
30     elif order < 0:
31         _viewers.insert(0, viewer)
32 
33 ##
34 # Displays a given image.
35 #
36 # @param image An image object.
37 # @param title Optional title.  Not all viewers can display the title.
38 # @param **options Additional viewer options.
39 # @return True if a suitable viewer was found, false otherwise.
40 
41 def show(image, title=None, **options):
42     for viewer in _viewers:
43         if viewer.show(image, title=title, **options):
44             return 1
45     return 0
46 
47 ##
48 # Base class for viewers.
49 
50 class Viewer:
51 
52     # main api
53 
54     def show(self, image, **options):
55 
56         # save temporary image to disk
57         if image.mode[:4] == "I;16":
58             # @PIL88 @PIL101
59             # "I;16" isn't an 'official' mode, but we still want to
60             # provide a simple way to show 16-bit images.
61             base = "L"
62             # FIXME: auto-contrast if max() > 255?
63         else:
64             base = Image.getmodebase(image.mode)
65         if base != image.mode and image.mode != "1":
66             image = image.convert(base)
67 
68         self.show_image(image, **options)
69 
70     # hook methods
71 
72     format = None
73 
74     def get_format(self, image):
75         # return format name, or None to save as PGM/PPM
76         return self.format
77 
78     def get_command(self, file, **options):
79         raise NotImplementedError
80 
81     def save_image(self, image):
82         # save to temporary file, and return filename
83         return image._dump(format=self.get_format(image))
84 
85     def show_image(self, image, **options):
86         # display given image
87         return self.show_file(self.save_image(image), **options)
88 
89     def show_file(self, file, **options):
90         # display given file
91         os.system(self.get_command(file, **options))
92         return 1
93 
94 # --------------------------------------------------------------------
95 
96 if sys.platform == "win32":
97 
98     class WindowsViewer(Viewer):
99         format = "BMP"
100         def get_command(self, file, **options):
101             return ("start /wait %s && ping -n 2 127.0.0.1 >NUL "
102                     "&& del /f %s" % (file, file))
103 
104     register(WindowsViewer)
105 
106 elif sys.platform == "darwin":
107 
108     class MacViewer(Viewer):
109         format = "BMP"
110         def get_command(self, file, **options):
111             # on darwin open returns immediately resulting in the temp
112             # file removal while app is opening
113             command = "open -a /Applications/Preview.app"
114             command = "(%s %s; sleep 20; rm -f %s)&" % (command, file, file)
115             return command
116 
117     register(MacViewer)
118 
119 else:
120 
121     # unixoids
122 
123     def which(executable):
124         path = os.environ.get("PATH")
125         if not path:
126             return None
127         for dirname in path.split(os.pathsep):
128             filename = os.path.join(dirname, executable)
129             if os.path.isfile(filename):
130                 # FIXME: make sure it's executable
131                 return filename
132         return None
133 
134     class UnixViewer(Viewer):
135         def show_file(self, file, **options):
136             command, executable = self.get_command_ex(file, **options)
137             command = "(%s %s; rm -f %s)&" % (command, file, file)
138             os.system(command)
139             return 1
140 
141     # implementations
142 
143     class DisplayViewer(UnixViewer):
144         def get_command_ex(self, file, **options):
145             command = executable = "display"
146             return command, executable
147 
148     if which("display"):
149         register(DisplayViewer)
150 
151     class XVViewer(UnixViewer):
152         def get_command_ex(self, file, title=None, **options):
153             # note: xv is pretty outdated.  most modern systems have
154             # imagemagick's display command instead.
155             command = executable = "xv"
156             if title:
157                 # FIXME: do full escaping
158                 command = command + " -name \"%s\"" % title
159             return command, executable
160 
161     if which("xv"):
162         register(XVViewer)
163 
164 if __name__ == "__main__":
165     # usage: python ImageShow.py imagefile [title]
166     print(show(Image.open(sys.argv[1]), *sys.argv[2:]))
167
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/PIL/ImageShow.py b/PIL/ImageShow.py
--- a/PIL/ImageShow.py
+++ b/PIL/ImageShow.py
@@ -65,7 +65,7 @@
         if base != image.mode and image.mode != "1":
             image = image.convert(base)
 
-        self.show_image(image, **options)
+        return self.show_image(image, **options)
 
     # hook methods

{"golden_diff": "diff --git a/PIL/ImageShow.py b/PIL/ImageShow.py\n--- a/PIL/ImageShow.py\n+++ b/PIL/ImageShow.py\n@@ -65,7 +65,7 @@\n         if base != image.mode and image.mode != \"1\":\n             image = image.convert(base)\n \n-        self.show_image(image, **options)\n+        return self.show_image(image, **options)\n \n     # hook methods\n", "issue": "Image opened twice if imagemagick and xv are installed\nIf ImageMagick and xv are both installed and you call Image.show() it will open the image twice, once with display and once with xv. This is probably related to the for loop over registered viewers. Not sure why the return 1 isn't working though.\n\n", "before_files": [{"content": "#\n# The Python Imaging Library.\n# $Id$\n#\n# im.show() drivers\n#\n# History:\n# 2008-04-06 fl   Created\n#\n# Copyright (c) Secret Labs AB 2008.\n#\n# See the README file for information on usage and redistribution.\n#\n\nfrom __future__ import print_function\n\nfrom PIL import Image\nimport os, sys\n\n_viewers = []\n\ndef register(viewer, order=1):\n    try:\n        if issubclass(viewer, Viewer):\n            viewer = viewer()\n    except TypeError:\n        pass # raised if viewer wasn't a class\n    if order > 0:\n        _viewers.append(viewer)\n    elif order < 0:\n        _viewers.insert(0, viewer)\n\n##\n# Displays a given image.\n#\n# @param image An image object.\n# @param title Optional title.  Not all viewers can display the title.\n# @param **options Additional viewer options.\n# @return True if a suitable viewer was found, false otherwise.\n\ndef show(image, title=None, **options):\n    for viewer in _viewers:\n        if viewer.show(image, title=title, **options):\n            return 1\n    return 0\n\n##\n# Base class for viewers.\n\nclass Viewer:\n\n    # main api\n\n    def show(self, image, **options):\n\n        # save temporary image to disk\n        if image.mode[:4] == \"I;16\":\n            # @PIL88 @PIL101\n            # \"I;16\" isn't an 'official' mode, but we still want to\n            # provide a simple way to show 16-bit images.\n            base = \"L\"\n            # FIXME: auto-contrast if max() > 255?\n        else:\n            base = Image.getmodebase(image.mode)\n        if base != image.mode and image.mode != \"1\":\n            image = image.convert(base)\n\n        self.show_image(image, **options)\n\n    # hook methods\n\n    format = None\n\n    def get_format(self, image):\n        # return format name, or None to save as PGM/PPM\n        return self.format\n\n    def get_command(self, file, **options):\n        raise NotImplementedError\n\n    def save_image(self, image):\n        # save to temporary file, and return filename\n        return image._dump(format=self.get_format(image))\n\n    def show_image(self, image, **options):\n        # display given image\n        return self.show_file(self.save_image(image), **options)\n\n    def show_file(self, file, **options):\n        # display given file\n        os.system(self.get_command(file, **options))\n        return 1\n\n# --------------------------------------------------------------------\n\nif sys.platform == \"win32\":\n\n    class WindowsViewer(Viewer):\n        format = \"BMP\"\n        def get_command(self, file, **options):\n            return (\"start /wait %s && ping -n 2 127.0.0.1 >NUL \"\n                    \"&& del /f %s\" % (file, file))\n\n    register(WindowsViewer)\n\nelif sys.platform == \"darwin\":\n\n    class MacViewer(Viewer):\n        format = \"BMP\"\n        def get_command(self, file, **options):\n            # on darwin open returns immediately resulting in the temp\n            # file removal while app is opening\n            command = \"open -a /Applications/Preview.app\"\n            command = \"(%s %s; sleep 20; rm -f %s)&\" % (command, file, file)\n            return command\n\n    register(MacViewer)\n\nelse:\n\n    # unixoids\n\n    def which(executable):\n        path = os.environ.get(\"PATH\")\n        if not path:\n            return None\n        for dirname in path.split(os.pathsep):\n            filename = os.path.join(dirname, executable)\n            if os.path.isfile(filename):\n                # FIXME: make sure it's executable\n                return filename\n        return None\n\n    class UnixViewer(Viewer):\n        def show_file(self, file, **options):\n            command, executable = self.get_command_ex(file, **options)\n            command = \"(%s %s; rm -f %s)&\" % (command, file, file)\n            os.system(command)\n            return 1\n\n    # implementations\n\n    class DisplayViewer(UnixViewer):\n        def get_command_ex(self, file, **options):\n            command = executable = \"display\"\n            return command, executable\n\n    if which(\"display\"):\n        register(DisplayViewer)\n\n    class XVViewer(UnixViewer):\n        def get_command_ex(self, file, title=None, **options):\n            # note: xv is pretty outdated.  most modern systems have\n            # imagemagick's display command instead.\n            command = executable = \"xv\"\n            if title:\n                # FIXME: do full escaping\n                command = command + \" -name \\\"%s\\\"\" % title\n            return command, executable\n\n    if which(\"xv\"):\n        register(XVViewer)\n\nif __name__ == \"__main__\":\n    # usage: python ImageShow.py imagefile [title]\n    print(show(Image.open(sys.argv[1]), *sys.argv[2:]))\n", "path": "PIL/ImageShow.py"}], "after_files": [{"content": "#\n# The Python Imaging Library.\n# $Id$\n#\n# im.show() drivers\n#\n# History:\n# 2008-04-06 fl   Created\n#\n# Copyright (c) Secret Labs AB 2008.\n#\n# See the README file for information on usage and redistribution.\n#\n\nfrom __future__ import print_function\n\nfrom PIL import Image\nimport os, sys\n\n_viewers = []\n\ndef register(viewer, order=1):\n    try:\n        if issubclass(viewer, Viewer):\n            viewer = viewer()\n    except TypeError:\n        pass # raised if viewer wasn't a class\n    if order > 0:\n        _viewers.append(viewer)\n    elif order < 0:\n        _viewers.insert(0, viewer)\n\n##\n# Displays a given image.\n#\n# @param image An image object.\n# @param title Optional title.  Not all viewers can display the title.\n# @param **options Additional viewer options.\n# @return True if a suitable viewer was found, false otherwise.\n\ndef show(image, title=None, **options):\n    for viewer in _viewers:\n        if viewer.show(image, title=title, **options):\n            return 1\n    return 0\n\n##\n# Base class for viewers.\n\nclass Viewer:\n\n    # main api\n\n    def show(self, image, **options):\n\n        # save temporary image to disk\n        if image.mode[:4] == \"I;16\":\n            # @PIL88 @PIL101\n            # \"I;16\" isn't an 'official' mode, but we still want to\n            # provide a simple way to show 16-bit images.\n            base = \"L\"\n            # FIXME: auto-contrast if max() > 255?\n        else:\n            base = Image.getmodebase(image.mode)\n        if base != image.mode and image.mode != \"1\":\n            image = image.convert(base)\n\n        return self.show_image(image, **options)\n\n    # hook methods\n\n    format = None\n\n    def get_format(self, image):\n        # return format name, or None to save as PGM/PPM\n        return self.format\n\n    def get_command(self, file, **options):\n        raise NotImplementedError\n\n    def save_image(self, image):\n        # save to temporary file, and return filename\n        return image._dump(format=self.get_format(image))\n\n    def show_image(self, image, **options):\n        # display given image\n        return self.show_file(self.save_image(image), **options)\n\n    def show_file(self, file, **options):\n        # display given file\n        os.system(self.get_command(file, **options))\n        return 1\n\n# --------------------------------------------------------------------\n\nif sys.platform == \"win32\":\n\n    class WindowsViewer(Viewer):\n        format = \"BMP\"\n        def get_command(self, file, **options):\n            return (\"start /wait %s && ping -n 2 127.0.0.1 >NUL \"\n                    \"&& del /f %s\" % (file, file))\n\n    register(WindowsViewer)\n\nelif sys.platform == \"darwin\":\n\n    class MacViewer(Viewer):\n        format = \"BMP\"\n        def get_command(self, file, **options):\n            # on darwin open returns immediately resulting in the temp\n            # file removal while app is opening\n            command = \"open -a /Applications/Preview.app\"\n            command = \"(%s %s; sleep 20; rm -f %s)&\" % (command, file, file)\n            return command\n\n    register(MacViewer)\n\nelse:\n\n    # unixoids\n\n    def which(executable):\n        path = os.environ.get(\"PATH\")\n        if not path:\n            return None\n        for dirname in path.split(os.pathsep):\n            filename = os.path.join(dirname, executable)\n            if os.path.isfile(filename):\n                # FIXME: make sure it's executable\n                return filename\n        return None\n\n    class UnixViewer(Viewer):\n        def show_file(self, file, **options):\n            command, executable = self.get_command_ex(file, **options)\n            command = \"(%s %s; rm -f %s)&\" % (command, file, file)\n            os.system(command)\n            return 1\n\n    # implementations\n\n    class DisplayViewer(UnixViewer):\n        def get_command_ex(self, file, **options):\n            command = executable = \"display\"\n            return command, executable\n\n    if which(\"display\"):\n        register(DisplayViewer)\n\n    class XVViewer(UnixViewer):\n        def get_command_ex(self, file, title=None, **options):\n            # note: xv is pretty outdated.  most modern systems have\n            # imagemagick's display command instead.\n            command = executable = \"xv\"\n            if title:\n                # FIXME: do full escaping\n                command = command + \" -name \\\"%s\\\"\" % title\n            return command, executable\n\n    if which(\"xv\"):\n        register(XVViewer)\n\nif __name__ == \"__main__\":\n    # usage: python ImageShow.py imagefile [title]\n    print(show(Image.open(sys.argv[1]), *sys.argv[2:]))\n", "path": "PIL/ImageShow.py"}]}