On Feb 10, 12:03 pm, "Gabriel Genellina" <[EMAIL PROTECTED]> wrote:
> > Does anybody know simple cross-platform method of probing if > > executable binary is available and launching it. > > > Problem no.1: test if executable file is available > > I'll take windows platform as the most relevant in this case. > > os.access() doesn't handle env PATHEXT and can't detect if a given > > path would be executable or not. Here "executable" means file that > > could be be launched by system() (if there are any other ways - I'd be > > happy to know them) > > > Suppose I have "ufo2exe" executable two directories up. > >>>> os.access("../../ufo2map.exe", os.X_OK) > > True > > > However... > >>>> os.access("../../ufo2map", os.X_OK) > > False > > That's right - such file does not exist. On Windows, in general, X_OK is > the same as F_OK: for any existing file, whatever name or extension, > returns True. Permissions are managed thru ACL and this simple function > does NOT consider them. It shouldn't matter if the file exists or not. Quoting http:// docs.python.org/lib/os-file-dir.html: " X_OK Value to include in the mode parameter of access() to determine if path can be executed. " See - there is no "file" notation as only "path" is tested and "path" is pretty executable. I think this should be clarified in os.access() documentation to make the whole business less confusing if not implemented in interpreter itself. After all the purpose of cross- platform language is to free developer from writing platform-specific code. > > > But... > >>>> os.system("..\..\ufo2map") > > ---- ufo2map 1.0 ---- > > 0 > > (Beware of single \ on normal strings!) > Use win32api.FindExecutable; should return the full path to ufo2map.exe. > "foo.txt" would return notepad.exe (or whatever you have associated to > text files). That is exactly what would be launched by os.system("foo.txt") Why isn't it possible to integrate the functionality in os.access() - IIUC Python interpreter still uses Windows API itself on this platform. > > Problem no.2: launch executable file > > The same windows platform again. All python commands are using forward > > slashes for paths, but system doesn't handle this situation (it could > > at least try to convert immediate forward slashes to backwards) > > Use os.path.normpath on the filename. (If you got it from FindExecutable > above, that would not be needed) > > > os.access() thinks this file is executable, but os.system() fails ... > >>>> os.access("../../ufo2map.exe", os.X_OK) > > True > >>>> os.system("../../ufo2map.exe") > > '..' is not recognized as an internal or external command, > > operable program or batch file. > > 1 > > > the contrary - access() fails to tell this path can be launched, but > > file Is executable, ... > >>>> os.access("..\..\ufo2map", os.X_OK) > > False > > Same as above - such file does not exist. Same as above - access() tests path, not file, so the argument is not valid. > >>>> os.system("..\..\ufo2map") > > ---- ufo2map 1.0 ---- > > 0 > > Is there any workaround in Python or I have to stick with platforms- > > specific quirks? > > I'm using Python 2.4.2 > > I think you will have to treat each platform differently. Just for > starting, the concept of "executable" is not the same across platforms. > But you could make some generic functions (with different implementations > on different platforms). I would prefer to know as little about underlying platforms as possible. It would only be a big plus for Python. -- --t. -- http://mail.python.org/mailman/listinfo/python-list