]> granicus.if.org Git - python/commitdiff
Implemented new os.startfile function, unique to Windows, exposing a
authorTim Peters <tim.peters@gmail.com>
Fri, 22 Sep 2000 10:05:54 +0000 (10:05 +0000)
committerTim Peters <tim.peters@gmail.com>
Fri, 22 Sep 2000 10:05:54 +0000 (10:05 +0000)
subset of Win32 ShellExecute's functionality.  Guido wants this because
IDLE's Help -> Docs function currently crashes his machine because of a
conflict between his version of Norton AntiVirus (6.10.20) and MS's
_popen.  Docs for startfile are being mailed to Fred (or just read the
docstring -- it tells the whole story).
Changed webbrowser.py to use os.startfile instead of os.popen on Windows.
Changed IDLE's EditorWindow.py to pass an absolute path for the docs
(hardcoding ShellExecute's "directory" arg to "." as used to be done let
IDLE work, but made the startfile command exceedingly obscure for other
uses -- the MS docs are terrible, of course, & still not sure I
understand it).
Note that Windows Python must link with shell32.lib now!  That's where
ShellExecute lives.

Lib/webbrowser.py
Modules/posixmodule.c
PCbuild/python20.dsp
Tools/idle/EditorWindow.py

index 66cdbffc93e1ef71605bba0beaf7fff6be7ea866..a8b0e8ba81b2c945c126e5b7e432031f43422d8d 100644 (file)
@@ -183,7 +183,7 @@ register("grail", Grail)
 
 class WindowsDefault:
     def open(self, url, new=0):
-        self.junk = os.popen("start " + url)
+        os.startfile(url)
 
     def open_new(self, url):
         self.open(url)
index e46d68a8e0053030af8e8385893e127c7cf98922..71a880f997baed8ab846a29de661b97e5d970fb1 100644 (file)
@@ -5102,6 +5102,38 @@ posix_abort(PyObject *self, PyObject *args)
     return NULL;
 }
 
+#ifdef MS_WIN32
+static char win32_startfile__doc__[] = "\
+startfile(filepath) - Start a file with its associated application.\n\
+\n\
+This acts like double-clicking the file in Explorer, or giving the file\n\
+name as an argument to the DOS \"start\" command:  the file is opened\n\
+with whatever application (if any) its extension is associated.\n\
+\n\
+startfile returns as soon as the associated application is launched.\n\
+There is no option to wait for the application to close, and no way\n\
+to retrieve the application's exit status.\n\
+\n\
+The filepath is relative to the current directory.  If you want to use\n\
+an absolute path, make sure the first character is not a slash (\"/\");\n\
+the underlying Win32 ShellExecute function doesn't work if it is.";
+
+static PyObject *
+win32_startfile(PyObject *self, PyObject *args)
+{
+       char *filepath;
+       HINSTANCE rc;
+       if (!PyArg_ParseTuple(args, "s:startfile", &filepath))
+               return NULL;
+       Py_BEGIN_ALLOW_THREADS
+       rc = ShellExecute((HWND)0, NULL, filepath, NULL, NULL, SW_SHOWNORMAL);
+       Py_END_ALLOW_THREADS
+       if (rc <= (HINSTANCE)32)
+               return win32_error("startfile", filepath);
+       Py_INCREF(Py_None);
+       return Py_None;
+}
+#endif
 
 static PyMethodDef posix_methods[] = {
        {"access",      posix_access, METH_VARARGS, posix_access__doc__},
@@ -5205,6 +5237,7 @@ static PyMethodDef posix_methods[] = {
        {"popen2",      win32_popen2, METH_VARARGS},
        {"popen3",      win32_popen3, METH_VARARGS},
        {"popen4",      win32_popen4, METH_VARARGS},
+       {"startfile",   win32_startfile, METH_VARARGS, win32_startfile__doc__},
 #endif
 #endif /* HAVE_POPEN */
 #ifdef HAVE_SETUID
index 4ad5c30d3a982f85e55aed691693c05db3ff3b70..f6e21139df538a2087e103c8996eda0121c2563f 100644 (file)
@@ -57,7 +57,7 @@ BSC32=bscmake.exe
 # ADD BSC32 /nologo\r
 LINK32=link.exe\r
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386\r
-# ADD LINK32 largeint.lib kernel32.lib user32.lib advapi32.lib /nologo /base:"0x1e100000" /subsystem:windows /dll /debug /machine:I386 /nodefaultlib:"libc"\r
+# ADD LINK32 largeint.lib kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /base:"0x1e100000" /subsystem:windows /dll /debug /machine:I386 /nodefaultlib:"libc"\r
 # SUBTRACT LINK32 /pdb:none\r
 \r
 !ELSEIF  "$(CFG)" == "python20 - Win32 Debug"\r
@@ -88,7 +88,7 @@ BSC32=bscmake.exe
 # ADD BSC32 /nologo\r
 LINK32=link.exe\r
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept\r
-# ADD LINK32 largeint.lib kernel32.lib user32.lib advapi32.lib /nologo /base:"0x1e100000" /subsystem:windows /dll /debug /machine:I386 /nodefaultlib:"libc" /out:"./python20_d.dll" /pdbtype:sept\r
+# ADD LINK32 largeint.lib kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /base:"0x1e100000" /subsystem:windows /dll /debug /machine:I386 /nodefaultlib:"libc" /out:"./python20_d.dll" /pdbtype:sept\r
 # SUBTRACT LINK32 /pdb:none\r
 \r
 !ELSEIF  "$(CFG)" == "python20 - Win32 Alpha Debug"\r
index 5feda4b72526b23e7bd65d9cf22960d1997b8a8e..589b0ab69f2222e127e122c1397010c1169983d7 100644 (file)
@@ -297,8 +297,9 @@ class EditorWindow:
 
     help_url = "http://www.python.org/doc/current/"
     if sys.platform[:3] == "win":
-        fn = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
-        fn = os.path.join(fn, "Doc", "index.html")
+        fn = os.path.dirname(__file__)
+        fn = os.path.join(fn, "../../Doc/index.html")
+        fn = os.path.normpath(fn)
         if os.path.isfile(fn):
             help_url = fn
         del fn