mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 11:37:35 +00:00
8af197560e
Actually Portable Python is now outperforming the Python binaries that come bundled with Linux distros, at things like HTTP serving. You can now have a fully featured Python install in just one .com file that runs on six operating systems and is about 10mb in size. With tuning, the tiniest is ~1mb. We've got most of the libraries working, including pysqlite, and the repl now feels very pleasant. The things you can't do quite yet are: threads and shared objects but that can happen in the future, if the community falls in love with this project and wants to see it developed further. Changes: - Add siginterrupt() - Add sqlite3 to Python - Add issymlink() helper - Make GetZipCdir() faster - Add tgamma() and finite() - Add legacy function lutimes() - Add readlink() and realpath() - Use heap allocations when appropriate - Reorganize Python into two-stage build - Save Lua / Python shell history to dotfile - Integrate Python Lib embedding into linkage - Make isregularfile() and isdirectory() go faster - Make Python shell auto-completion work perfectly - Make crash reports work better if changed directory - Fix Python+NT open() / access() flag overflow error - Disable Python tests relating to \N{LONG NAME} syntax - Have Python REPL copyright() show all notice embeddings The biggest technical challenge at the moment is working around when Python tries to be too clever about filenames.
109 lines
3.2 KiB
Python
109 lines
3.2 KiB
Python
"""
|
|
The objects used by the site module to add custom builtins.
|
|
"""
|
|
|
|
# Those objects are almost immortal and they keep a reference to their module
|
|
# globals. Defining them in the site module would keep too many references
|
|
# alive.
|
|
# Note this means this module should also avoid keep things alive in its
|
|
# globals.
|
|
|
|
import sys
|
|
|
|
class Quitter(object):
|
|
def __init__(self, name, eof):
|
|
self.name = name
|
|
self.eof = eof
|
|
def __repr__(self):
|
|
return 'Use %s() or %s to exit' % (self.name, self.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)
|
|
|
|
|
|
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=()):
|
|
import os
|
|
self.__name = name
|
|
self.__data = data
|
|
self.__lines = None
|
|
self.__filenames = [os.path.join(dir, filename)
|
|
for dir in dirs
|
|
for filename in files]
|
|
|
|
def __setup(self):
|
|
if self.__lines:
|
|
return
|
|
data = None
|
|
for filename in self.__filenames:
|
|
try:
|
|
with open(filename, "r") as fp:
|
|
data = fp.read()
|
|
break
|
|
except OSError:
|
|
pass
|
|
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()
|
|
import os
|
|
if os.isatty(1):
|
|
prompt = 'Hit Return for more, or q (and Return) to quit: '
|
|
n = os.get_terminal_size().lines
|
|
else:
|
|
n = self.MAXLINES
|
|
lineno = 0
|
|
while 1:
|
|
try:
|
|
for i in range(lineno, lineno + n):
|
|
print(self.__lines[i])
|
|
except IndexError:
|
|
break
|
|
else:
|
|
lineno += n
|
|
key = None
|
|
if os.isatty(1):
|
|
while key is None:
|
|
key = input(prompt)
|
|
if key not in ('', 'q'):
|
|
key = None
|
|
if key == 'q':
|
|
break
|
|
|
|
|
|
class _Helper(object):
|
|
"""Define the builtin 'help'.
|
|
|
|
This is a wrapper around pydoc.help that provides a helpful message
|
|
when 'help' is typed at the Python interactive prompt.
|
|
|
|
Calling help() at the Python prompt starts an interactive help session.
|
|
Calling help(thing) prints help for the python object 'thing'.
|
|
"""
|
|
|
|
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)
|