| 
									
										
										
										
											2009-11-16 06:49:25 +00:00
										 |  |  | # Common utility functions used by various script execution tests | 
					
						
							|  |  |  | #  e.g. test_cmd_line, test_cmd_line_script and test_runpy | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-13 19:41:47 +02:00
										 |  |  | import collections | 
					
						
							| 
									
										
										
										
											2012-04-27 13:52:03 -04:00
										 |  |  | import importlib | 
					
						
							| 
									
										
										
										
											2009-11-16 06:49:25 +00:00
										 |  |  | import sys | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import os.path | 
					
						
							|  |  |  | import subprocess | 
					
						
							|  |  |  | import py_compile | 
					
						
							|  |  |  | import zipfile | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-15 17:11:25 -04:00
										 |  |  | from importlib.util import source_from_cache | 
					
						
							| 
									
										
										
										
											2019-12-08 08:38:16 +01:00
										 |  |  | from test.support import make_legacy_pyc | 
					
						
							| 
									
										
										
										
											2010-04-17 00:19:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-04 00:59:40 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Cached result of the expensive test performed in the function below. | 
					
						
							|  |  |  | __cached_interp_requires_environment = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-04 01:04:31 -08:00
										 |  |  | def interpreter_requires_environment(): | 
					
						
							| 
									
										
										
										
											2015-02-04 00:59:40 -08:00
										 |  |  |     """
 | 
					
						
							|  |  |  |     Returns True if our sys.executable interpreter requires environment | 
					
						
							|  |  |  |     variables in order to be able to run at all. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     This is designed to be used with @unittest.skipIf() to annotate tests | 
					
						
							|  |  |  |     that need to use an assert_python*() function to launch an isolated | 
					
						
							|  |  |  |     mode (-I) or no environment mode (-E) sub-interpreter process. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     A normal build & test does not run into this situation but it can happen | 
					
						
							|  |  |  |     when trying to run the standard library test suite from an interpreter that | 
					
						
							|  |  |  |     doesn't have an obvious home with Python's current home finding logic. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Setting PYTHONHOME is one way to get most of the testsuite to run in that | 
					
						
							| 
									
										
										
										
											2015-04-14 09:30:01 +03:00
										 |  |  |     situation.  PYTHONPATH or PYTHONUSERSITE are other common environment | 
					
						
							| 
									
										
										
										
											2015-02-04 00:59:40 -08:00
										 |  |  |     variables that might impact whether or not the interpreter can start. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     global __cached_interp_requires_environment | 
					
						
							|  |  |  |     if __cached_interp_requires_environment is None: | 
					
						
							| 
									
										
										
										
											2018-02-17 18:59:03 -08:00
										 |  |  |         # If PYTHONHOME is set, assume that we need it | 
					
						
							|  |  |  |         if 'PYTHONHOME' in os.environ: | 
					
						
							|  |  |  |             __cached_interp_requires_environment = True | 
					
						
							|  |  |  |             return True | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-04 00:59:40 -08:00
										 |  |  |         # Try running an interpreter with -E to see if it works or not. | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             subprocess.check_call([sys.executable, '-E', | 
					
						
							|  |  |  |                                    '-c', 'import sys; sys.exit(0)']) | 
					
						
							|  |  |  |         except subprocess.CalledProcessError: | 
					
						
							|  |  |  |             __cached_interp_requires_environment = True | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             __cached_interp_requires_environment = False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return __cached_interp_requires_environment | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 13:16:15 +10:00
										 |  |  | class _PythonRunResult(collections.namedtuple("_PythonRunResult", | 
					
						
							|  |  |  |                                           ("rc", "out", "err"))): | 
					
						
							|  |  |  |     """Helper for reporting Python subprocess run results""" | 
					
						
							|  |  |  |     def fail(self, cmd_line): | 
					
						
							|  |  |  |         """Provide helpful details about failed subcommand runs""" | 
					
						
							|  |  |  |         # Limit to 80 lines to ASCII characters | 
					
						
							|  |  |  |         maxlen = 80 * 100 | 
					
						
							|  |  |  |         out, err = self.out, self.err | 
					
						
							|  |  |  |         if len(out) > maxlen: | 
					
						
							|  |  |  |             out = b'(... truncated stdout ...)' + out[-maxlen:] | 
					
						
							|  |  |  |         if len(err) > maxlen: | 
					
						
							|  |  |  |             err = b'(... truncated stderr ...)' + err[-maxlen:] | 
					
						
							|  |  |  |         out = out.decode('ascii', 'replace').rstrip() | 
					
						
							|  |  |  |         err = err.decode('ascii', 'replace').rstrip() | 
					
						
							|  |  |  |         raise AssertionError("Process return code is %d\n" | 
					
						
							|  |  |  |                              "command line: %r\n" | 
					
						
							|  |  |  |                              "\n" | 
					
						
							|  |  |  |                              "stdout:\n" | 
					
						
							|  |  |  |                              "---\n" | 
					
						
							|  |  |  |                              "%s\n" | 
					
						
							|  |  |  |                              "---\n" | 
					
						
							|  |  |  |                              "\n" | 
					
						
							|  |  |  |                              "stderr:\n" | 
					
						
							|  |  |  |                              "---\n" | 
					
						
							|  |  |  |                              "%s\n" | 
					
						
							|  |  |  |                              "---" | 
					
						
							|  |  |  |                              % (self.rc, cmd_line, | 
					
						
							|  |  |  |                                 out, | 
					
						
							|  |  |  |                                 err)) | 
					
						
							| 
									
										
										
										
											2015-04-13 19:41:47 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-16 06:49:25 +00:00
										 |  |  | # Executing the interpreter in a subprocess | 
					
						
							| 
									
										
										
										
											2015-04-13 19:41:47 +02:00
										 |  |  | def run_python_until_end(*args, **env_vars): | 
					
						
							| 
									
										
										
										
											2015-02-04 17:16:30 -08:00
										 |  |  |     env_required = interpreter_requires_environment() | 
					
						
							| 
									
										
										
										
											2018-03-25 23:03:10 +10:00
										 |  |  |     cwd = env_vars.pop('__cwd', None) | 
					
						
							| 
									
										
										
										
											2013-10-12 14:44:01 +02:00
										 |  |  |     if '__isolated' in env_vars: | 
					
						
							|  |  |  |         isolated = env_vars.pop('__isolated') | 
					
						
							|  |  |  |     else: | 
					
						
							| 
									
										
										
										
											2015-02-04 17:10:19 -08:00
										 |  |  |         isolated = not env_vars and not env_required | 
					
						
							| 
									
										
										
										
											2013-06-25 21:24:36 +02:00
										 |  |  |     cmd_line = [sys.executable, '-X', 'faulthandler'] | 
					
						
							| 
									
										
										
										
											2013-10-12 14:44:01 +02:00
										 |  |  |     if isolated: | 
					
						
							|  |  |  |         # isolated mode: ignore Python environment variables, ignore user | 
					
						
							|  |  |  |         # site-packages, and don't add the current directory to sys.path | 
					
						
							|  |  |  |         cmd_line.append('-I') | 
					
						
							| 
									
										
										
										
											2015-02-04 17:10:19 -08:00
										 |  |  |     elif not env_vars and not env_required: | 
					
						
							| 
									
										
										
										
											2013-10-12 14:44:01 +02:00
										 |  |  |         # ignore Python environment variables | 
					
						
							| 
									
										
										
										
											2010-11-09 21:33:55 +00:00
										 |  |  |         cmd_line.append('-E') | 
					
						
							| 
									
										
										
										
											2017-01-12 11:51:46 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-20 19:54:16 +01:00
										 |  |  |     # But a special flag that can be set to override -- in this case, the | 
					
						
							|  |  |  |     # caller is responsible to pass the full environment. | 
					
						
							|  |  |  |     if env_vars.pop('__cleanenv', None): | 
					
						
							|  |  |  |         env = {} | 
					
						
							| 
									
										
										
										
											2017-01-12 11:51:46 +01:00
										 |  |  |         if sys.platform == 'win32': | 
					
						
							|  |  |  |             # Windows requires at least the SYSTEMROOT environment variable to | 
					
						
							|  |  |  |             # start Python. | 
					
						
							|  |  |  |             env['SYSTEMROOT'] = os.environ['SYSTEMROOT'] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Other interesting environment variables, not copied currently: | 
					
						
							|  |  |  |         # COMSPEC, HOME, PATH, TEMP, TMPDIR, TMP. | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         # Need to preserve the original environment, for in-place testing of | 
					
						
							|  |  |  |         # shared library builds. | 
					
						
							|  |  |  |         env = os.environ.copy() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # set TERM='' unless the TERM environment variable is passed explicitly | 
					
						
							|  |  |  |     # see issues #11390 and #18300 | 
					
						
							|  |  |  |     if 'TERM' not in env_vars: | 
					
						
							|  |  |  |         env['TERM'] = '' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 22:04:44 +00:00
										 |  |  |     env.update(env_vars) | 
					
						
							| 
									
										
										
										
											2012-02-20 19:54:16 +01:00
										 |  |  |     cmd_line.extend(args) | 
					
						
							| 
									
										
										
										
											2016-08-17 12:29:58 +02:00
										 |  |  |     proc = subprocess.Popen(cmd_line, stdin=subprocess.PIPE, | 
					
						
							| 
									
										
										
										
											2010-11-09 21:33:55 +00:00
										 |  |  |                          stdout=subprocess.PIPE, stderr=subprocess.PIPE, | 
					
						
							| 
									
										
										
										
											2018-03-25 23:03:10 +10:00
										 |  |  |                          env=env, cwd=cwd) | 
					
						
							| 
									
										
										
										
											2016-08-17 12:29:58 +02:00
										 |  |  |     with proc: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             out, err = proc.communicate() | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             proc.kill() | 
					
						
							|  |  |  |             subprocess._cleanup() | 
					
						
							|  |  |  |     rc = proc.returncode | 
					
						
							| 
									
										
										
										
											2015-04-13 19:41:47 +02:00
										 |  |  |     return _PythonRunResult(rc, out, err), cmd_line | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-01 11:00:15 +03:00
										 |  |  | def _assert_python(expected_success, /, *args, **env_vars): | 
					
						
							| 
									
										
										
										
											2015-04-13 19:41:47 +02:00
										 |  |  |     res, cmd_line = run_python_until_end(*args, **env_vars) | 
					
						
							|  |  |  |     if (res.rc and expected_success) or (not res.rc and not expected_success): | 
					
						
							| 
									
										
										
										
											2017-06-11 13:16:15 +10:00
										 |  |  |         res.fail(cmd_line) | 
					
						
							| 
									
										
										
										
											2015-04-13 19:41:47 +02:00
										 |  |  |     return res | 
					
						
							| 
									
										
										
										
											2010-10-08 18:05:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 21:33:55 +00:00
										 |  |  | def assert_python_ok(*args, **env_vars): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Assert that running the interpreter with `args` and optional environment | 
					
						
							| 
									
										
										
										
											2013-08-11 16:48:44 -07:00
										 |  |  |     variables `env_vars` succeeds (rc == 0) and return a (return code, stdout, | 
					
						
							|  |  |  |     stderr) tuple. | 
					
						
							| 
									
										
										
										
											2013-10-12 14:44:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-13 20:00:24 -08:00
										 |  |  |     If the __cleanenv keyword is set, env_vars is used as a fresh environment. | 
					
						
							| 
									
										
										
										
											2013-10-12 14:44:01 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Python is started in isolated mode (command line option -I), | 
					
						
							|  |  |  |     except if the __isolated keyword is set to False. | 
					
						
							| 
									
										
										
										
											2010-11-09 21:33:55 +00:00
										 |  |  |     """
 | 
					
						
							|  |  |  |     return _assert_python(True, *args, **env_vars) | 
					
						
							| 
									
										
										
										
											2010-10-08 18:05:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 21:33:55 +00:00
										 |  |  | def assert_python_failure(*args, **env_vars): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Assert that running the interpreter with `args` and optional environment | 
					
						
							| 
									
										
										
										
											2013-08-11 16:48:44 -07:00
										 |  |  |     variables `env_vars` fails (rc != 0) and return a (return code, stdout, | 
					
						
							|  |  |  |     stderr) tuple. | 
					
						
							| 
									
										
										
										
											2013-10-12 14:44:01 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     See assert_python_ok() for more options. | 
					
						
							| 
									
										
										
										
											2010-11-09 21:33:55 +00:00
										 |  |  |     """
 | 
					
						
							|  |  |  |     return _assert_python(False, *args, **env_vars) | 
					
						
							| 
									
										
										
										
											2009-11-16 06:49:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-11 13:42:17 +02:00
										 |  |  | def spawn_python(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw): | 
					
						
							| 
									
										
										
										
											2013-08-11 16:48:44 -07:00
										 |  |  |     """Run a Python subprocess with the given arguments.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     kw is extra keyword args to pass to subprocess.Popen. Returns a Popen | 
					
						
							|  |  |  |     object. | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2018-02-17 18:59:03 -08:00
										 |  |  |     cmd_line = [sys.executable] | 
					
						
							|  |  |  |     if not interpreter_requires_environment(): | 
					
						
							|  |  |  |         cmd_line.append('-E') | 
					
						
							| 
									
										
										
										
											2009-11-16 06:49:25 +00:00
										 |  |  |     cmd_line.extend(args) | 
					
						
							| 
									
										
										
										
											2014-05-11 16:59:16 +02:00
										 |  |  |     # Under Fedora (?), GNU readline can output junk on stderr when initialized, | 
					
						
							|  |  |  |     # depending on the TERM setting.  Setting TERM=vt100 is supposed to disable | 
					
						
							|  |  |  |     # that.  References: | 
					
						
							|  |  |  |     # - http://reinout.vanrees.org/weblog/2009/08/14/readline-invisible-character-hack.html | 
					
						
							|  |  |  |     # - http://stackoverflow.com/questions/15760712/python-readline-module-prints-escape-character-during-import | 
					
						
							|  |  |  |     # - http://lists.gnu.org/archive/html/bug-readline/2007-08/msg00004.html | 
					
						
							| 
									
										
										
										
											2014-05-11 19:13:43 +02:00
										 |  |  |     env = kw.setdefault('env', dict(os.environ)) | 
					
						
							|  |  |  |     env['TERM'] = 'vt100' | 
					
						
							| 
									
										
										
										
											2009-11-16 06:49:25 +00:00
										 |  |  |     return subprocess.Popen(cmd_line, stdin=subprocess.PIPE, | 
					
						
							| 
									
										
										
										
											2014-05-11 13:42:17 +02:00
										 |  |  |                             stdout=stdout, stderr=stderr, | 
					
						
							| 
									
										
										
										
											2011-03-31 01:31:06 +02:00
										 |  |  |                             **kw) | 
					
						
							| 
									
										
										
										
											2009-11-16 06:49:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def kill_python(p): | 
					
						
							| 
									
										
										
										
											2013-08-11 16:48:44 -07:00
										 |  |  |     """Run the given Popen process until completion and return stdout.""" | 
					
						
							| 
									
										
										
										
											2009-11-16 06:49:25 +00:00
										 |  |  |     p.stdin.close() | 
					
						
							|  |  |  |     data = p.stdout.read() | 
					
						
							|  |  |  |     p.stdout.close() | 
					
						
							|  |  |  |     # try to cleanup the child so we don't appear to leak when running | 
					
						
							| 
									
										
										
										
											2009-12-08 19:27:24 +00:00
										 |  |  |     # with regrtest -R. | 
					
						
							|  |  |  |     p.wait() | 
					
						
							| 
									
										
										
										
											2009-11-16 06:49:25 +00:00
										 |  |  |     subprocess._cleanup() | 
					
						
							|  |  |  |     return data | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-15 20:33:02 +10:00
										 |  |  | def make_script(script_dir, script_basename, source, omit_suffix=False): | 
					
						
							|  |  |  |     script_filename = script_basename | 
					
						
							|  |  |  |     if not omit_suffix: | 
					
						
							|  |  |  |         script_filename += os.extsep + 'py' | 
					
						
							| 
									
										
										
										
											2009-11-16 06:49:25 +00:00
										 |  |  |     script_name = os.path.join(script_dir, script_filename) | 
					
						
							| 
									
										
										
										
											2010-02-27 16:12:22 +00:00
										 |  |  |     # The script should be encoded to UTF-8, the default string encoding | 
					
						
							| 
									
										
										
										
											2019-03-05 10:06:26 +02:00
										 |  |  |     with open(script_name, 'w', encoding='utf-8') as script_file: | 
					
						
							|  |  |  |         script_file.write(source) | 
					
						
							| 
									
										
										
										
											2012-04-27 13:52:03 -04:00
										 |  |  |     importlib.invalidate_caches() | 
					
						
							| 
									
										
										
										
											2009-11-16 06:49:25 +00:00
										 |  |  |     return script_name | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def make_zip_script(zip_dir, zip_basename, script_name, name_in_zip=None): | 
					
						
							|  |  |  |     zip_filename = zip_basename+os.extsep+'zip' | 
					
						
							|  |  |  |     zip_name = os.path.join(zip_dir, zip_filename) | 
					
						
							| 
									
										
										
										
											2019-03-05 10:06:26 +02:00
										 |  |  |     with zipfile.ZipFile(zip_name, 'w') as zip_file: | 
					
						
							|  |  |  |         if name_in_zip is None: | 
					
						
							|  |  |  |             parts = script_name.split(os.sep) | 
					
						
							|  |  |  |             if len(parts) >= 2 and parts[-2] == '__pycache__': | 
					
						
							|  |  |  |                 legacy_pyc = make_legacy_pyc(source_from_cache(script_name)) | 
					
						
							|  |  |  |                 name_in_zip = os.path.basename(legacy_pyc) | 
					
						
							|  |  |  |                 script_name = legacy_pyc | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 name_in_zip = os.path.basename(script_name) | 
					
						
							|  |  |  |         zip_file.write(script_name, name_in_zip) | 
					
						
							| 
									
										
										
										
											2010-07-28 16:39:41 +00:00
										 |  |  |     #if test.support.verbose: | 
					
						
							| 
									
										
										
										
											2019-03-05 10:06:26 +02:00
										 |  |  |     #    with zipfile.ZipFile(zip_name, 'r') as zip_file: | 
					
						
							|  |  |  |     #        print 'Contents of %r:' % zip_name | 
					
						
							|  |  |  |     #        zip_file.printdir() | 
					
						
							| 
									
										
										
										
											2009-11-16 06:49:25 +00:00
										 |  |  |     return zip_name, os.path.join(zip_name, name_in_zip) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-17 13:06:11 +00:00
										 |  |  | def make_pkg(pkg_dir, init_source=''): | 
					
						
							| 
									
										
										
										
											2009-11-16 06:49:25 +00:00
										 |  |  |     os.mkdir(pkg_dir) | 
					
						
							| 
									
										
										
										
											2010-08-17 13:06:11 +00:00
										 |  |  |     make_script(pkg_dir, '__init__', init_source) | 
					
						
							| 
									
										
										
										
											2009-11-16 06:49:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def make_zip_pkg(zip_dir, zip_basename, pkg_name, script_basename, | 
					
						
							|  |  |  |                  source, depth=1, compiled=False): | 
					
						
							|  |  |  |     unlink = [] | 
					
						
							|  |  |  |     init_name = make_script(zip_dir, '__init__', '') | 
					
						
							|  |  |  |     unlink.append(init_name) | 
					
						
							|  |  |  |     init_basename = os.path.basename(init_name) | 
					
						
							|  |  |  |     script_name = make_script(zip_dir, script_basename, source) | 
					
						
							|  |  |  |     unlink.append(script_name) | 
					
						
							|  |  |  |     if compiled: | 
					
						
							| 
									
										
										
										
											2014-06-20 17:49:10 -04:00
										 |  |  |         init_name = py_compile.compile(init_name, doraise=True) | 
					
						
							|  |  |  |         script_name = py_compile.compile(script_name, doraise=True) | 
					
						
							| 
									
										
										
										
											2009-11-16 06:49:25 +00:00
										 |  |  |         unlink.extend((init_name, script_name)) | 
					
						
							|  |  |  |     pkg_names = [os.sep.join([pkg_name]*i) for i in range(1, depth+1)] | 
					
						
							|  |  |  |     script_name_in_zip = os.path.join(pkg_names[-1], os.path.basename(script_name)) | 
					
						
							|  |  |  |     zip_filename = zip_basename+os.extsep+'zip' | 
					
						
							|  |  |  |     zip_name = os.path.join(zip_dir, zip_filename) | 
					
						
							| 
									
										
										
										
											2019-03-05 10:06:26 +02:00
										 |  |  |     with zipfile.ZipFile(zip_name, 'w') as zip_file: | 
					
						
							|  |  |  |         for name in pkg_names: | 
					
						
							|  |  |  |             init_name_in_zip = os.path.join(name, init_basename) | 
					
						
							|  |  |  |             zip_file.write(init_name, init_name_in_zip) | 
					
						
							|  |  |  |         zip_file.write(script_name, script_name_in_zip) | 
					
						
							| 
									
										
										
										
											2009-11-16 06:49:25 +00:00
										 |  |  |     for name in unlink: | 
					
						
							|  |  |  |         os.unlink(name) | 
					
						
							| 
									
										
										
										
											2010-07-28 16:39:41 +00:00
										 |  |  |     #if test.support.verbose: | 
					
						
							| 
									
										
										
										
											2019-03-05 10:06:26 +02:00
										 |  |  |     #    with zipfile.ZipFile(zip_name, 'r') as zip_file: | 
					
						
							|  |  |  |     #        print 'Contents of %r:' % zip_name | 
					
						
							|  |  |  |     #        zip_file.printdir() | 
					
						
							| 
									
										
										
										
											2009-11-16 06:49:25 +00:00
										 |  |  |     return zip_name, os.path.join(zip_name, script_name_in_zip) |