Permalink
Cannot retrieve contributors at this time
Fetching contributors…

""" | |
web2py.site_27.py | |
Source: | |
This is the 3.4 PyInstaller's fake site.py | |
(see https://github.com/pyinstaller/pyinstaller/blob/develop/PyInstaller/fake-modules/site.py) | |
with the addition of the original 2.7 cpython code (see https://github.com/python/cpython/blob/2.7/Lib/site.py ) | |
and adapted for reducing the size of the resulting frozen code | |
Purpose: | |
having back additional commands (mainly help and quit) in the python shell | |
Usage: | |
after installing PyInstaller, rename this file to site.py and overwrite the existing PyInstaller one; | |
on Windows 10: C:/Python27/Lib/site-packages/PyInstaller/fake-modules/site.py | |
on Mac: /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/PyInstaller/fake-modules/site.py | |
""" | |
#----------------------------------------------------------------------------- | |
# Copyright (c) 2013-2018, PyInstaller Development Team. | |
# | |
# Distributed under the terms of the GNU General Public License with exception | |
# for distributing bootloader. | |
# | |
# The full license is in the file COPYING.txt, distributed with this software. | |
#----------------------------------------------------------------------------- | |
""" | |
This is a fake 'site' module available in default Python Library. | |
The real 'site' does some magic to find paths to other possible | |
Python modules. We do not want this behaviour for frozen applications. | |
Fake 'site' makes PyInstaller to work with distutils and to work inside | |
virtualenv environment. | |
""" | |
# Marker to be used in our test-suite. | |
__pyinstaller__faked__site__module__ = True | |
# TODO test the following code stub from real 'site' module. | |
# Prefixes for site-packages; add additional prefixes like /usr/local here | |
PREFIXES = [] | |
# Enable per user site-packages directory | |
# set it to False to disable the feature or True to force the feature | |
ENABLE_USER_SITE = False | |
# For distutils.commands.install | |
# These values are initialized by the getuserbase() and getusersitepackages() | |
# functions, through the main() function when Python starts. | |
# Issue #1699: Freezing pip requires 'site.USER_SITE' to be a 'str' not None. | |
USER_SITE = '' | |
USER_BASE = None | |
# | |
# The following has been borrowed from https://github.com/python/cpython/blob/2.7/Lib/site.py | |
# and adapted for reducing the size of the frozen code | |
# | |
import os | |
import sys | |
import __builtin__ | |
def setquit(): | |
"""Define new builtins 'quit' and 'exit'. | |
These are objects which make the interpreter exit when called. | |
The repr of each object contains a hint at how it works. | |
""" | |
if os.sep == ':': | |
eof = 'Cmd-Q' | |
elif os.sep == '\\': | |
eof = 'Ctrl-Z plus Return' | |
else: | |
eof = 'Ctrl-D (i.e. EOF)' | |
class Quitter(object): | |
def __init__(self, name): | |
self.name = name | |
def __repr__(self): | |
return 'Use %s() or %s to exit' % (self.name, eof) | |
def __call__(self, code=None): | |
# Shells like IDLE catch the SystemExit, but listen when their | |
# stdin wrapper is closed. | |
try: | |
sys.stdin.close() | |
except: | |
pass | |
raise SystemExit(code) | |
__builtin__.quit = Quitter('quit') | |
__builtin__.exit = Quitter('exit') | |
class _Printer(object): | |
"""interactive prompt objects for printing the license text, a list of | |
contributors and the copyright notice.""" | |
MAXLINES = 23 | |
def __init__(self, name, data, files=(), dirs=()): | |
self.__name = name | |
self.__data = data | |
self.__files = files | |
self.__dirs = dirs | |
self.__lines = None | |
def __setup(self): | |
if self.__lines: | |
return | |
data = None | |
for dir in self.__dirs: | |
for filename in self.__files: | |
filename = os.path.join(dir, filename) | |
try: | |
fp = file(filename, "rU") | |
data = fp.read() | |
fp.close() | |
break | |
except IOError: | |
pass | |
if data: | |
break | |
if not data: | |
data = self.__data | |
self.__lines = data.split('\n') | |
self.__linecnt = len(self.__lines) | |
def __repr__(self): | |
self.__setup() | |
if len(self.__lines) <= self.MAXLINES: | |
return "\n".join(self.__lines) | |
else: | |
return "Type %s() to see the full %s text" % ((self.__name,)*2) | |
def __call__(self): | |
self.__setup() | |
prompt = 'Hit Return for more, or q (and Return) to quit: ' | |
lineno = 0 | |
while 1: | |
try: | |
for i in range(lineno, lineno + self.MAXLINES): | |
print self.__lines[i] | |
except IndexError: | |
break | |
else: | |
lineno += self.MAXLINES | |
key = None | |
while key is None: | |
key = raw_input(prompt) | |
if key not in ('', 'q'): | |
key = None | |
if key == 'q': | |
break | |
def setcopyright(): | |
"""Set 'copyright' and 'credits' in __builtin__""" | |
__builtin__.copyright = _Printer("copyright", sys.copyright) | |
__builtin__.credits = _Printer("credits", """\ | |
Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands | |
for supporting Python development. See www.python.org for more information.""") | |
here = os.path.dirname(os.__file__) | |
__builtin__.license = _Printer( | |
"license", "See https://www.python.org/psf/license/", | |
["LICENSE.txt", "LICENSE"], | |
[os.path.join(here, os.pardir), here, os.curdir]) | |
class _Helper(object): | |
"""Define the builtin 'help'. | |
This is a wrapper around pydoc.help (with a twist). | |
""" | |
def __repr__(self): | |
return "Type help() for interactive help, " \ | |
"or help(object) for help about object." | |
def __call__(self, *args, **kwds): | |
import pydoc | |
return pydoc.help(*args, **kwds) | |
def sethelper(): | |
__builtin__.help = _Helper() | |
def main(): | |
"""Add standard site-specific directories to the module search path. | |
This function is called automatically when this module is imported, | |
unless the python interpreter was started with the -S flag. | |
""" | |
setquit() | |
setcopyright() | |
sethelper() | |
main() |