#!/bin/false # You must specify a python interpreter. u"Tahoe-LAFS does not run under Python 3. Please use a version of Python between 2.4.4 and 2.7.x inclusive." import sys, os, subprocess where = os.path.realpath(sys.argv[0]) base = os.path.dirname(os.path.dirname(where)) if sys.platform == "win32": perhaps_installed_tahoe = os.path.join(os.path.dirname(sys.executable), 'Scripts', 'tahoe.pyscript') else: perhaps_installed_tahoe = "/usr/bin/tahoe" whoami = '''\ I am a "bin%stahoe" executable who is only for the convenience of running Tahoe from its source distribution -- I work only when invoked as the "tahoe" script that lives in the "bin" subdirectory of a Tahoe source code distribution, and only if you have already run "python setup.py build". ''' % (os.path.sep,) # look for Tahoe.home . homemarker = os.path.join(base, "Tahoe.home") if not os.path.exists(homemarker): print whoami print '''\ I just tried to run and found that I am not living in such a directory, so I am stopping now. To run Tahoe after it has been is installed, please execute my brother, who gets installed into the appropriate place for executables when you run "make install" (perhaps as "%s"). ''' % (perhaps_installed_tahoe,) sys.exit(1) # we've found our home. Put the tahoe support/lib etc. in our PYTHONPATH. if sys.platform == "win32": supportdir = os.path.join(base, "support", "Lib", "site-packages") else: supportdir = os.path.join(base, "support", "lib", "python%d.%d" % sys.version_info[:2], "site-packages") # update PYTHONPATH so that child processes (like twistd) will use this too pp = os.environ.get("PYTHONPATH") if pp: pp = os.pathsep.join([supportdir] + pp.split(os.pathsep)) else: pp = supportdir os.environ["PYTHONPATH"] = pp # find commandline args and the location of the tahoe executable. if sys.platform == "win32": import re from ctypes import WINFUNCTYPE, POINTER, byref, c_wchar_p, c_int, windll GetCommandLineW = WINFUNCTYPE(c_wchar_p)(("GetCommandLineW", windll.kernel32)) CommandLineToArgvW = WINFUNCTYPE(POINTER(c_wchar_p), c_wchar_p, POINTER(c_int)) \ (("CommandLineToArgvW", windll.shell32)) argc = c_int(0) argv_unicode = CommandLineToArgvW(GetCommandLineW(), byref(argc)) # See src/allmydata/scripts/runner.py for the corresponding unmangler. # Note that this doesn't escape \x7F. If it did, test_unicode_arguments_and_output # in test_runner.py wouldn't work. def mangle(s): return str(re.sub(ur'[^\x20-\x7F]', lambda m: u'\x7F%x;' % (ord(m.group(0)),), s)) argv = [mangle(argv_unicode[i]) for i in xrange(0, argc.value)] # Take only the suffix with the same number of arguments as sys.argv. # This accounts for anything that can cause initial arguments to be stripped, # for example, the Python interpreter or any options passed to it, or runner # scripts such as 'coverage run'. It works even if there are no such arguments, # as in the case of a frozen executable created by bb-freeze or similar. argv = argv[-len(sys.argv):] # On Windows, the script is not directly executable and must be run via python. prefix = [sys.executable] script = os.path.join(base, "support", "Scripts", "tahoe.pyscript") args = argv[1:] else: # On non-Windows, invoke the script directly, so that 'top' for example shows 'tahoe'. prefix = [] script = os.path.join(base, "support", "bin", "tahoe") args = sys.argv[1:] if not os.path.exists(script): print whoami print '''\ I just tried to run and could not find my brother at "%s". To run Tahoe when it is installed, please execute my brother, who gets installed into the appropriate place for executables when you run "python setup.py install" (perhaps as "%s"). ''' % (script, perhaps_installed_tahoe) sys.exit(1) command = prefix + [script] + args try: res = subprocess.call(command, env=os.environ) except Exception, le: print whoami print '''\ I just tried to invoke my brother at "%s" and got an exception. ''' % (script,) raise else: sys.exit(res)