Commit e3f7235a authored by Jason R. Coombs's avatar Jason R. Coombs

Updated win_script_wrapper to run on Python 2 and Python 3

--HG--
branch : distribute
parent 7cf9cd93
...@@ -16,16 +16,18 @@ Let's create a simple script, foo-script.py: ...@@ -16,16 +16,18 @@ Let's create a simple script, foo-script.py:
>>> import os, sys, tempfile >>> import os, sys, tempfile
>>> from setuptools.command.easy_install import nt_quote_arg >>> from setuptools.command.easy_install import nt_quote_arg
>>> sample_directory = tempfile.mkdtemp() >>> sample_directory = tempfile.mkdtemp()
>>> open(os.path.join(sample_directory, 'foo-script.py'), 'w').write( >>> f = open(os.path.join(sample_directory, 'foo-script.py'), 'w')
>>> bytes = f.write(
... """#!%(python_exe)s ... """#!%(python_exe)s
... import sys ... import sys
... input = repr(sys.stdin.read()) ... input = repr(sys.stdin.read())
... print sys.argv[0][-14:] ... print(sys.argv[0][-14:])
... print sys.argv[1:] ... print(sys.argv[1:])
... print input ... print(input)
... if __debug__: ... if __debug__:
... print 'non-optimized' ... print('non-optimized')
... """ % dict(python_exe=nt_quote_arg(sys.executable))) ... """ % dict(python_exe=nt_quote_arg(sys.executable)))
>>> f.close()
Note that the script starts with a Unix-style '#!' line saying which Note that the script starts with a Unix-style '#!' line saying which
Python executable to run. The wrapper will use this to find the Python executable to run. The wrapper will use this to find the
...@@ -34,9 +36,11 @@ correct Python executable. ...@@ -34,9 +36,11 @@ correct Python executable.
We'll also copy cli.exe to the sample-directory with the name foo.exe: We'll also copy cli.exe to the sample-directory with the name foo.exe:
>>> import pkg_resources >>> import pkg_resources
>>> open(os.path.join(sample_directory, 'foo.exe'), 'wb').write( >>> f = open(os.path.join(sample_directory, 'foo.exe'), 'wb')
>>> bytes = f.write(
... pkg_resources.resource_string('setuptools', 'cli.exe') ... pkg_resources.resource_string('setuptools', 'cli.exe')
... ) ... )
>>> f.close()
When the copy of cli.exe, foo.exe in this example, runs, it examines When the copy of cli.exe, foo.exe in this example, runs, it examines
the path name it was run with and computes a Python script path name the path name it was run with and computes a Python script path name
...@@ -45,12 +49,12 @@ GUI programs, the suffix '-script-pyw' is added.) This is why we ...@@ -45,12 +49,12 @@ GUI programs, the suffix '-script-pyw' is added.) This is why we
named out script the way we did. Now we can run out script by running named out script the way we did. Now we can run out script by running
the wrapper: the wrapper:
>>> import os >>> import subprocess
>>> input, output = os.popen4('"'+nt_quote_arg(os.path.join(sample_directory, 'foo.exe')) >>> cmd = [os.path.join(sample_directory, 'foo.exe'), 'arg1', 'arg 2',
... + r' arg1 "arg 2" "arg \"2\\\"" "arg 4\\" "arg5 a\\b"') ... 'arg "2\\"', 'arg 4\\', 'arg5 a\\\\b']
>>> input.write('hello\nworld\n') >>> proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
>>> input.close() >>> stdout, stderr = proc.communicate('hello\nworld\n'.encode('ascii'))
>>> print output.read(), >>> bytes = sys.stdout.write(stdout.decode('ascii').replace('\r\n', '\n'))
\foo-script.py \foo-script.py
['arg1', 'arg 2', 'arg "2\\"', 'arg 4\\', 'arg5 a\\\\b'] ['arg1', 'arg 2', 'arg "2\\"', 'arg 4\\', 'arg5 a\\\\b']
'hello\nworld\n' 'hello\nworld\n'
...@@ -77,21 +81,23 @@ to start the interactive interpreter. You can combine multiple ...@@ -77,21 +81,23 @@ to start the interactive interpreter. You can combine multiple
options as usual. For example, to run in optimized mode and options as usual. For example, to run in optimized mode and
enter the interpreter after running the script, you could use -Oi: enter the interpreter after running the script, you could use -Oi:
>>> open(os.path.join(sample_directory, 'foo-script.py'), 'w').write( >>> f = open(os.path.join(sample_directory, 'foo-script.py'), 'w')
>>> bytes = f.write(
... """#!%(python_exe)s -Oi ... """#!%(python_exe)s -Oi
... import sys ... import sys
... input = repr(sys.stdin.read()) ... input = repr(sys.stdin.read())
... print sys.argv[0][-14:] ... print(sys.argv[0][-14:])
... print sys.argv[1:] ... print(sys.argv[1:])
... print input ... print(input)
... if __debug__: ... if __debug__:
... print 'non-optimized' ... print('non-optimized')
... sys.ps1 = '---' ... sys.ps1 = '---'
... """ % dict(python_exe=nt_quote_arg(sys.executable))) ... """ % dict(python_exe=nt_quote_arg(sys.executable)))
>>> f.close()
>>> input, output = os.popen4(nt_quote_arg(os.path.join(sample_directory, 'foo.exe'))) >>> cmd = [os.path.join(sample_directory, 'foo.exe')]
>>> input.close() >>> proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT)
>>> print output.read(), >>> stdout, stderr = proc.communicate()
>>> bytes = sys.stdout.write(stdout.decode('ascii').replace('\r\n', '\n'))
\foo-script.py \foo-script.py
[] []
'' ''
...@@ -105,29 +111,38 @@ Now let's test the GUI version with the simple scipt, bar-script.py: ...@@ -105,29 +111,38 @@ Now let's test the GUI version with the simple scipt, bar-script.py:
>>> import os, sys, tempfile >>> import os, sys, tempfile
>>> from setuptools.command.easy_install import nt_quote_arg >>> from setuptools.command.easy_install import nt_quote_arg
>>> sample_directory = tempfile.mkdtemp() >>> sample_directory = tempfile.mkdtemp()
>>> open(os.path.join(sample_directory, 'bar-script.pyw'), 'w').write( >>> f = open(os.path.join(sample_directory, 'bar-script.pyw'), 'w')
>>> bytes = f.write(
... """#!%(python_exe)s ... """#!%(python_exe)s
... import sys ... import sys
... open(sys.argv[1], 'wb').write(repr(sys.argv[2])) ... open(sys.argv[1], 'wb').write(repr(sys.argv[2]).encode('ascii'))
... """ % dict(python_exe=nt_quote_arg(sys.executable))) ... """ % dict(python_exe=nt_quote_arg(sys.executable)))
>>> f.close()
We'll also copy gui.exe to the sample-directory with the name bar.exe: We'll also copy gui.exe to the sample-directory with the name bar.exe:
>>> import pkg_resources >>> import pkg_resources
>>> open(os.path.join(sample_directory, 'bar.exe'), 'wb').write( >>> f = open(os.path.join(sample_directory, 'bar.exe'), 'wb')
>>> bytes = f.write(
... pkg_resources.resource_string('setuptools', 'gui.exe') ... pkg_resources.resource_string('setuptools', 'gui.exe')
... ) ... )
>>> f.close()
Finally, we'll run the script and check the result: Finally, we'll run the script and check the result:
>>> import os >>> cmd = [
>>> input, output = os.popen4('"'+nt_quote_arg(os.path.join(sample_directory, 'bar.exe')) ... os.path.join(sample_directory, 'bar.exe'),
... + r' "%s" "Test Argument"' % os.path.join(sample_directory, 'test_output.txt')) ... os.path.join(sample_directory, 'test_output.txt'),
>>> input.close() ... 'Test Argument',
>>> print output.read() ... ]
>>> proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT)
>>> stdout, stderr = proc.communicate()
>>> print(stdout.decode('ascii'))
<BLANKLINE> <BLANKLINE>
>>> print open(os.path.join(sample_directory, 'test_output.txt'), 'rb').read() >>> f_out = open(os.path.join(sample_directory, 'test_output.txt'), 'rb')
>>> print(f_out.read().decode('ascii'))
'Test Argument' 'Test Argument'
>>> f_out.close()
We're done with the sample_directory: We're done with the sample_directory:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment