"""distutils.command.build_scriptsImplements the Distutils 'build_scripts' command."""__revision__ = "$Id$"import os, refrom stat import ST_MODEfrom distutils import sysconfigfrom distutils.core import Commandfrom distutils.dep_util import newerfrom distutils.util import convert_pathfrom distutils import log# check if Python is called on the first line with this expressionfirst_line_re = re.compile('^#!.*python[0-9.]*([ \t].*)?$')class build_scripts (Command):description = "\"build\" scripts (copy and fixup #! line)"user_options = [('build-dir=', 'd', "directory to \"build\" (copy) to"),('force', 'f', "forcibly build everything (ignore file timestamps"),('executable=', 'e', "specify final destination interpreter path"),]boolean_options = ['force']def initialize_options (self):self.build_dir = Noneself.scripts = Noneself.force = Noneself.executable = Noneself.outfiles = Nonedef finalize_options (self):self.set_undefined_options('build',('build_scripts', 'build_dir'),('force', 'force'),('executable', 'executable'))self.scripts = self.distribution.scriptsdef get_source_files(self):return self.scriptsdef run (self):if not self.scripts:returnself.copy_scripts()def copy_scripts (self):"""Copy each script listed in 'self.scripts'; if it's marked as aPython script in the Unix way (first line matches 'first_line_re',ie. starts with "\#!" and contains "python"), then adjust the firstline to refer to the current Python interpreter as we copy."""self.mkpath(self.build_dir)outfiles = []for script in self.scripts:adjust = 0script = convert_path(script)outfile = os.path.join(self.build_dir, os.path.basename(script))outfiles.append(outfile)if not self.force and not newer(script, outfile):log.debug("not copying %s (up-to-date)", script)continue# 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, "r")except IOError:if not self.dry_run:raisef = Noneelse:first_line = f.readline()if not first_line:self.warn("%s is an empty file (skipping)" % script)continuematch = first_line_re.match(first_line)if match:adjust = 1post_interp = match.group(1) or ''if adjust:log.info("copying and adjusting %s -> %s", script,self.build_dir)if not self.dry_run:outf = open(outfile, "w")if not sysconfig.python_build:outf.write("#!%s%s\n" %(self.executable,post_interp))else:outf.write("#!%s%s\n" %(os.path.join(sysconfig.get_config_var("BINDIR"),"python" + sysconfig.get_config_var("VERSION")+ sysconfig.get_config_var("EXE")),post_interp))outf.writelines(f.readlines())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:log.info("changing mode of %s", file)else:oldmode = os.stat(file)[ST_MODE] & 07777newmode = (oldmode | 0555) & 07777if newmode != oldmode:log.info("changing mode of %s from %o to %o",file, oldmode, newmode)os.chmod(file, newmode)# copy_scripts ()# class build_scripts
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。