Files
brew/Library/Homebrew/language/python.rb
T
Vlad ShablinskyandXu Cheng 3fb5d70a72 Unify Version.create usage
Substitue each Version.new and HeadVersion.new with Version.create
to unify Version and HeadVersion instantiation among core code.

Note that this does not relate to Mac::OS::Version class.
2016-07-16 20:39:13 +08:00

101 lines
3.2 KiB
Ruby

require "utils"
module Language
module Python
def self.major_minor_version(python)
version = /\d\.\d/.match `#{python} --version 2>&1`
return unless version
Version.create(version.to_s)
end
def self.homebrew_site_packages(version = "2.7")
HOMEBREW_PREFIX/"lib/python#{version}/site-packages"
end
def self.each_python(build, &block)
original_pythonpath = ENV["PYTHONPATH"]
["python", "python3"].each do |python|
next if build.without? python
version = major_minor_version python
ENV["PYTHONPATH"] = if Formulary.factory(python).installed?
nil
else
homebrew_site_packages(version)
end
block.call python, version if block
end
ENV["PYTHONPATH"] = original_pythonpath
end
def self.reads_brewed_pth_files?(python)
version = major_minor_version python
return unless homebrew_site_packages(version).directory?
return unless homebrew_site_packages(version).writable_real?
probe_file = homebrew_site_packages(version)/"homebrew-pth-probe.pth"
begin
probe_file.atomic_write("import site; site.homebrew_was_here = True")
quiet_system python, "-c", "import site; assert(site.homebrew_was_here)"
ensure
probe_file.unlink if probe_file.exist?
end
end
def self.user_site_packages(python)
Pathname.new(`#{python} -c "import site; print(site.getusersitepackages())"`.chomp)
end
def self.in_sys_path?(python, path)
script = <<-EOS.undent
import os, sys
[os.path.realpath(p) for p in sys.path].index(os.path.realpath("#{path}"))
EOS
quiet_system python, "-c", script
end
# deprecated; use system "python", *setup_install_args(prefix) instead
def self.setup_install(python, prefix, *args)
opoo <<-EOS.undent
Language::Python.setup_install is deprecated.
If you are a formula author, please use
system "python", *Language::Python.setup_install_args(prefix)
instead.
EOS
# force-import setuptools, which monkey-patches distutils, to make
# sure that we always call a setuptools setup.py. trick borrowed from pip:
# https://github.com/pypa/pip/blob/043af83/pip/req/req_install.py#L743-L780
shim = <<-EOS.undent
import setuptools, tokenize
__file__ = 'setup.py'
exec(compile(getattr(tokenize, 'open', open)(__file__).read()
.replace('\\r\\n', '\\n'), __file__, 'exec'))
EOS
args += %w[--single-version-externally-managed --record=installed.txt]
args << "--prefix=#{prefix}"
system python, "-c", shim, "install", *args
end
def self.setup_install_args(prefix)
shim = <<-EOS.undent
import setuptools, tokenize
__file__ = 'setup.py'
exec(compile(getattr(tokenize, 'open', open)(__file__).read()
.replace('\\r\\n', '\\n'), __file__, 'exec'))
EOS
%W[
-c
#{shim}
--no-user-cfg
install
--prefix=#{prefix}
--single-version-externally-managed
--record=installed.txt
]
end
def self.package_available?(python, module_name)
quiet_system python, "-c", "import #{module_name}"
end
end
end