def load_setup(): """run the setup script (i.e the setup.py file) This function load the setup file in all cases (even if it have already been loaded before, because we are monkey patching its setup function with a particular one""" f = open("setup.py", "rb") try: encoding, lines = detect_encoding(f.readline) finally: f.close() f = open("setup.py") try: imp.load_module("setup", f, "setup.py", (".py", "r", imp.PY_SOURCE)) finally: f.close()
def copy_scripts(self): """Copy each script listed in 'self.scripts'; if it's marked as a Python script in the Unix way (first line matches 'first_line_re', ie. starts with "\#!" and contains "python"), then adjust the first line to refer to the current Python interpreter as we copy. """ # XXX use self.execute(shutil.rmtree, ...) self.rmpath(self.build_dir) self.mkpath(self.build_dir) outfiles = [] for script in self.scripts: adjust = False script = convert_path(script) outfile = os.path.join(self.build_dir, os.path.basename(script)) outfiles.append(outfile) # Always open the file, but ignore failures in dry-run mode -- # that way, we'll get accurate feedback if we can read the # script. try: f = open(script, "rb") except IOError: if not self.dry_run: raise f = None else: encoding, lines = detect_encoding(f.readline) f.seek(0) first_line = f.readline() if not first_line: logger.warning('%s: %s is an empty file (skipping)', self.get_command_name(), script) continue match = first_line_re.match(first_line) if match: adjust = True post_interp = match.group(1) or '' if adjust: logger.info("copying and adjusting %s -> %s", script, self.build_dir) if not self.dry_run: if not sysconfig.is_python_build(): executable = self.executable else: executable = os.path.join( sysconfig.get_config_var("BINDIR"), "python%s%s" % (sysconfig.get_config_var("VERSION"), sysconfig.get_config_var("EXE"))) executable = fsencode(executable) shebang = "#!" + executable + post_interp + "\n" # Python parser starts to read a script using UTF-8 until # it gets a #coding:xxx cookie. The shebang has to be the # first line of a file, the #coding:xxx cookie cannot be # written before. So the shebang has to be decodable from # UTF-8. try: shebang.decode('utf-8') except UnicodeDecodeError: raise ValueError( "The shebang (%r) is not decodable " "from utf-8" % shebang) # If the script is encoded to a custom encoding (use a # #coding:xxx cookie), the shebang has to be decodable from # the script encoding too. try: shebang.decode(encoding) except UnicodeDecodeError: raise ValueError( "The shebang (%r) is not decodable " "from the script encoding (%s)" % ( shebang, encoding)) outf = open(outfile, "wb") try: outf.write(shebang) outf.writelines(f.readlines()) finally: outf.close() if f: f.close() else: if f: f.close() self.copy_file(script, outfile) if os.name == 'posix': for file in outfiles: if self.dry_run: logger.info("changing mode of %s", file) else: oldmode = os.stat(file).st_mode & 07777 newmode = (oldmode | 0555) & 07777 if newmode != oldmode: logger.info("changing mode of %s from %o to %o", file, oldmode, newmode) os.chmod(file, newmode) return outfiles