| Guido van Rossum | e8afe51 | 1998-09-28 22:02:40 +0000 | [diff] [blame] | 1 | IBM VisualAge C/C++ for OS/2 | 
 | 2 | ============================ | 
 | 3 |  | 
 | 4 | To build Python for OS/2, change into ./os2vacpp and issue an 'NMAKE' | 
 | 5 | command.  This will build a PYTHON15.DLL containing the set of Python | 
 | 6 | modules listed in config.c and a small PYTHON.EXE to start the | 
 | 7 | interpreter. | 
 | 8 |  | 
 | 9 | By changing the C compiler flag /Gd- in the makefile to /Gd+, you can | 
 | 10 | reduce the size of these by causing Python to dynamically link to the | 
 | 11 | C runtime DLLs instead of including their bulk in your binaries.  | 
 | 12 | However, this means that any system on which you run Python must have | 
 | 13 | the VAC++ compiler installed in order to have those DLLs available. | 
 | 14 |  | 
 | 15 | During the build process you may see a couple of harmless warnings: | 
 | 16 |  | 
 | 17 |   From the C Compiler, "No function prototype given for XXX", which | 
 | 18 |   comes from the use of K&R parameters within Python for portability. | 
 | 19 |  | 
 | 20 |   From the ILIB librarian, "Module Not Found (XXX)", which comes | 
 | 21 |   from its attempt to perform the (-+) operation, which removes and | 
 | 22 |   then adds a .OBJ to the library.  The first time a build is done, | 
 | 23 |   it obviously cannot remove what is not yet built. | 
 | 24 |  | 
 | 25 | This build includes support for most Python functionality as well as | 
 | 26 | TCP/IP sockets.  It omits the Posix ability to 'fork' a process but | 
 | 27 | supports threads using OS/2 native capabilities.  I have tried to | 
 | 28 | support everything possible but here are a few usage notes. | 
 | 29 |  | 
 | 30 |  | 
 | 31 | -- os.popen() Usage Warnings | 
 | 32 |  | 
 | 33 | With respect to my implementation of popen() under OS/2: | 
 | 34 |  | 
 | 35 |     import os | 
 | 36 |  | 
 | 37 |     fd = os.popen("pkzip.exe -@ junk.zip", 'wb') | 
 | 38 |     fd.write("file1.txt\n") | 
 | 39 |     fd.write("file2.txt\n") | 
 | 40 |     fd.write("file3.txt\n") | 
 | 41 |     fd.write("\x1a")  # Should Not Be Necessary But Is | 
 | 42 |     fd.close() | 
 | 43 |  | 
 | 44 | There is a bug, either in the VAC++ compiler or OS/2 itself, where the | 
 | 45 | simple closure of the write-side of a pipe -to- a process does not | 
 | 46 | send an EOF to that process.  I find I must explicitly write a | 
 | 47 | control-Z (EOF) before closing the pipe.  This is not a problem when | 
 | 48 | using popen() in read mode. | 
 | 49 |  | 
 | 50 | One other slight difference with my popen() is that I return None | 
 | 51 | from the close(), instead of the Unix convention of the return code | 
 | 52 | of the spawned program.  I could find no easy way to do this under | 
 | 53 | OS/2. | 
 | 54 |  | 
 | 55 |  | 
 | 56 | -- BEGINLIBPATH/ENDLIBPATH | 
 | 57 |  | 
 | 58 | With respect to environment variables, this OS/2 port supports the | 
 | 59 | special-to-OS/2 magic names of 'BEGINLIBPATH' and 'ENDLIBPATH' to | 
 | 60 | control where to load conventional DLLs from.  Those names are | 
 | 61 | intercepted and converted to calls on the OS/2 kernel APIs and | 
 | 62 | are inherited by child processes, whether Python-based or not. | 
 | 63 |  | 
 | 64 | A few new attributes have been added to the os module: | 
 | 65 |  | 
 | 66 |     os.meminstalled  # Count of Bytes of RAM Installed on Machine | 
 | 67 |     os.memkernel     # Count of Bytes of RAM Reserved (Non-Swappable) | 
 | 68 |     os.memvirtual    # Count of Bytes of Virtual RAM Possible | 
 | 69 |     os.timeslice     # Duration of Scheduler Timeslice, in Milliseconds | 
 | 70 |     os.maxpathlen    # Maximum Length of a Path Specification, in chars | 
 | 71 |     os.maxnamelen    # Maximum Length of a Single Dir/File Name, in chars | 
 | 72 |     os.version       # Version of OS/2 Being Run e.g. "4.00" | 
 | 73 |     os.revision      # Revision of OS/2 Being Run (usually zero) | 
 | 74 |     os.bootdrive     # Drive that System Booted From e.g. "C:" | 
 | 75 |                      # (useful to find the CONFIG.SYS used to boot with) | 
 | 76 |  | 
 | 77 |  | 
 | 78 | -- Using Python as the Default OS/2 Batch Language | 
 | 79 |  | 
 | 80 | Note that OS/2 supports the Unix technique of putting the special | 
 | 81 | comment line at the time of scripts e.g. "#!/usr/bin/python" in | 
 | 82 | a different syntactic form.  To do this, put your script into a file | 
 | 83 | with a .CMD extension and added 'extproc' to the top as follows: | 
 | 84 |  | 
 | 85 |     extproc C:\Python\Python.exe -x | 
 | 86 |     import os | 
 | 87 |     print "Hello from Python" | 
 | 88 |  | 
 | 89 | The '-x' option tells Python to skip the first line of the file | 
 | 90 | while processing the rest as normal Python source. | 
 | 91 |  | 
 | 92 |  | 
 | 93 | -- Suggested Environment Variable Setup | 
 | 94 |  | 
 | 95 | With respect to the environment variables for Python, I use the | 
 | 96 | following setup: | 
 | 97 |  | 
 | 98 |     Set PYTHONHOME=E:\Tau\Projects\Python;D:\DLLs | 
 | 99 |     Set PYTHONPATH=.;E:\Tau\Projects\Python\Lib; \ | 
 | 100 |                      E:\Tau\Projects\Python\Lib\plat-win | 
 | 101 |  | 
 | 102 | The EXEC_PREFIX (optional second pathspec on PYTHONHOME) is where | 
 | 103 | you put any Python extension DLLs you may create/obtain.  There | 
 | 104 | are none provided with this release. | 
 | 105 |  | 
 | 106 |  | 
 | 107 | -- Contact Info | 
 | 108 |  | 
 | 109 | If you have questions, suggestions or problems specifically with | 
 | 110 | the OS/2 VAC++ port of Python, please contact me at: | 
 | 111 |  | 
 | 112 |     Jeff Rush <jrush@summit-research.com>. | 
 | 113 |  | 
 | 114 | I support no other platform but OS/2 (and eventually AmigaDOS). |