classification
Title: Add shutil.open
Type: enhancement Stage:
Components: Library (Lib) Versions: Python 3.3
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: Arfrever, Hobson.Lane, Roman.Evstifeev, benjamin.peterson, cvrebert, eric.araujo, ganadist, giampaolo.rodola, larry, pitrou, r.david.murray, ronaldoussoren, rosslagerwall, smarnach, tebeka
Priority: low Keywords: patch

Created on 2008-06-23 11:38 by ganadist, last changed 2012-07-31 16:03 by ronaldoussoren.

Files
File name Uploaded Description Edit
os_startfile.diff ganadist, 2008-06-24 02:34 patch that implemented os.startfile()
shutil_open.py cvrebert, 2012-04-23 08:04 implementation sketch
shutil_launch.py Hobson.Lane, 2012-04-23 10:29 The last 1/3rd of Rebert's implementation of shutil.open()
shutil_open.patch Hobson.Lane, 2012-04-23 10:39 Implementation of shutil_open feature, untested on Windows
shutil_open.patch Hobson.Lane, 2012-04-23 16:09
shutil_open.patch Hobson.Lane, 2012-04-23 16:34 provides shutil.launch() to do os.startfile() cross-platform
shutil_open.patch Hobson.Lane, 2012-04-23 17:35 another round of improvement
shutil_open.patch cvrebert, 2012-04-23 23:53 revised patch
issue3177-os_startfile_macosx.txt ronaldoussoren, 2012-07-31 16:03 review
Messages (59)
msg68623 - (view) Author: Young-Ho Cha (ganadist) Date: 2008-06-23 11:38
Currently, os.startfile is implemented in Win32 only, but there are
command line tools in Unix and MacOSX that have same behavior.

As a result of http://portland.freedesktop.org, unix desktop has command
line tool named "xdg-open"
(http://portland.freedesktop.org/xdg-utils-1.0/xdg-open.html).

And MacOSX has 'open'
(http://developer.apple.com/documentation/Darwin/Reference/ManPages/man1/open.1.html)
command, and it can be used in same condition.
msg68650 - (view) Author: Benjamin Peterson (benjamin.peterson) * (Python committer) Date: 2008-06-23 21:32
Those commands can be easily used through the subprocess module.
However, if a patch is provided, it could be accepted.
msg68664 - (view) Author: Young-Ho Cha (ganadist) Date: 2008-06-24 02:34
I implemented os.startfile on posix and MacOSX as you said.

but it need more work to handle error.
msg140059 - (view) Author: Ross Lagerwall (rosslagerwall) (Python committer) Date: 2011-07-09 12:15
Closed #12522 as a duplicate.

It contains a link to a discussion on python-ideas requesting the feature.
msg140275 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2011-07-13 15:39
I’m not sure we want to copy the Windows startfile call for other OSes.  The os module is designed to wrap system-level calls, masking OS differences (for sendfile, for example) but not going further; it’s up to other modules (like shutil) to build more convenient APIs on top of what os provides.  xdg-open is a program that’s used to open files or URIs, but it does not provide other actions like Windows’ startfile does (edit, print, etc.), not is it backed by a system call.  For these reasons, I think it’s inappropriate to implement os.startfile for non-Windows systems.  People can use subprocess to run open or xdg-open.
msg140276 - (view) Author: Giampaolo Rodola' (giampaolo.rodola) * (Python committer) Date: 2011-07-13 15:41
+1 on what Eric just said.
See issue 10882 and msg 126049
msg140280 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2011-07-13 16:06
So, unless someone wants to turn this request into “Add shutil.open”, I’ll close it in a few days.  (I haven’t found the original discussion; if someone could add a link to the archives on mail.python.org or copy relevant quotes, it could help.)
msg140283 - (view) Author: Ram Rachum (cool-RR) * Date: 2011-07-13 16:23
Eric, I have no problem with this function being placed in `shutil` instead of `os`, as long as it's implemented and it's in the standard library, and people don't have to use subprocess to run open or xdg-open themselves as I currently do.

So I have no problem with renaming this bug to "Add shutil.open".
msg140415 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2011-07-15 15:13
> as long as it's implemented and it's in the standard library, and
> people don't have to use subprocess to run open or xdg-open themselves
> as I currently do.

This new function would call os.startfile on Windows, xdg-open where applicable, and open on Mac OS X (using a subprocess for these last two).

I found the python-ideas thread: http://mail.python.org/pipermail/python-ideas/2011-July/010674.html
There was only limited support.
msg140416 - (view) Author: STINNER Victor (haypo) * (Python committer) Date: 2011-07-15 15:19
> dependencies: + Finding programs in PATH, adding shutil.which

Why did you add this dependency? For example, subprocess is able to locate a program if the program has no full path. We don't need a which function.
msg140418 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2011-07-15 15:20
See also lengthy discussion on #1301512.
msg140419 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2011-07-15 15:25
>> dependencies: + Finding programs in PATH, adding shutil.which
> Why did you add this dependency? For example, subprocess is able to
> locate a program if the program has no full path. We don't need a
> which function.

While the Windows API call is part of Windows and the open program always present on Mac OS X, xdg-open is an optional program on free OSes, so I thought we’d need shutil.which to look before we leap.  The alternative is to call Popen(['xdg-open', etc.]) and check if we get ENOENT, but I don’t know if this would be non-ambiguous (for example, do we get ENOENT if xdg-open exists but not the file?).

A related question: what to do when we’re not on Windows nor Mac and xdg-open doesn’t exist?  Raise NotImplemented?
msg157216 - (view) Author: Chris Rebert (cvrebert) * Date: 2012-03-31 17:51
> The alternative is to call Popen(['xdg-open', etc.]) and check if we get ENOENT, but I don’t know if this would be non-ambiguous (for example, do we get ENOENT if xdg-open exists but not the file?).

It's unambiguous. Python itself never opens the target file, it just passes the filepath string along to the xdg-open command. If Popen raises EnvironmentError, then xdg-open could not be executed. If the target file is nonexistent, then xdg-open will exit with status 2 (see aforelinked manpage). Entirely different error mechanisms.

> A related question: what to do when we’re not on Windows nor Mac and xdg-open doesn’t exist?  Raise NotImplemented?

Seems reasonable to me.


So, the failure cases are:
(1) Platform doesn't support this feature -> raise NotImplemented
(2) Target file doesn't exist
(3) Target file is inaccessible
(4) No application is associated with the file type in question

OS X and xdg-open report (2) and (4), does Windows?
OS X reports (3) indirectly/vaguely [generic exit status 1 w/ possibly unstable error message]; don't know what Windows and xdg-open do here.
msg157246 - (view) Author: STINNER Victor (haypo) * (Python committer) Date: 2012-04-01 00:50
> (1) Platform doesn't support this feature -> raise NotImplemented

It's better to not define the function if the platform doesn't support
the feature.
msg157247 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2012-04-01 01:01
>> [...] do we get ENOENT if xdg-open exists but not the file?).
> It's unambiguous. Python itself never opens the target file, it just passes the filepath string
> along to the xdg-open command. If Popen raises EnvironmentError, then xdg-open could not be
> executed. If the target file is nonexistent, then xdg-open will exit with status 2 (see
> aforelinked manpage). Entirely different error mechanisms.

You are right, I was confusing the layers!  Good then.

> So, the failure cases are:
> (1) Platform doesn't support this feature -> raise NotImplemented

Actually the exception is NotImplementedError.  Its doc says that it’s to be used in a method that is intended to be overriden in subclasses, but I think it’s not wrong to 

> (2) Target file doesn't exist
> (3) Target file is inaccessible
> (4) No application is associated with the file type in question

I think that instead of mapping error codes to custom exceptions, which is fragile and not trivial to maintain, we should just catch stderr and raise something like OSError(stderr).

[Victor]
>> It's better to not define the function if the platform doesn't support the feature.
That’s easy to do if we can say detect the availability of a function in the libc, but here the function would depend on a program which could get removed or added between two calls to the function, so we have no choice.
msg157258 - (view) Author: Chris Rebert (cvrebert) * Date: 2012-04-01 06:31
>> (2) Target file doesn't exist
>> (4) No application is associated with the file type in question
> I think that instead of mapping error codes to custom exceptions, which is fragile and not trivial to maintain, we should just catch stderr and raise something like OSError(stderr)

It runs counter to the goal of a cross-platform API if *all* the errors are platform-specific. I grant that a generic API cannot wrap *every* possible error, but (2) and (4) are amongst the most common+obvious failure modes and are (FWICT) explicitly reported by all 3 native interfaces. If we don't consolidate them, we'll basically be condemning non-trivial users to copying (or writing themselves, probably inferiorly) a chunk of boilerplate recipe code, and if we're fine with that, then why bother having (this in) the std lib at all?

I don't think the handling code for them would be particularly fragile/onerous; we're talking a mere ~2 constants per platform, all tied to pretty-unlikely-to-change native interfaces. For context, here would be (AFAICT; I only have a Mac ATM) the constants in question:

Windows: function return value:
ERROR_FILE_NOT_FOUND, ERROR_PATH_NOT_FOUND
SE_ERR_NOASSOC

xdg-open (*nix): exit code:
2
3

Mac OS X: exit code 1 w/ stderr output:
"The file XXX does not exist."
"No application knows how to open XXX."
msg159000 - (view) Author: Hobs (Hobson.Lane) Date: 2012-04-23 05:52
@eric.araujo, @giampaolo.rodola, 
(http://bugs.python.org/issue3177#msg140275)

I'm not sure I understand why this was moved to shutil.open. It seems appropriate to try to accomplish what os.startfile() does in a cross-platform way. Don't many of the other os.* calls do this--check os.name and then "do the right thing". This is the first os.* call I've found that doesn't work on linux (though I'm sure there are many others). Is the reason because the name 'startfile' is a Windows creation and sounds Windowsy? If so, shouldn't os.startfile() be renamed to something generic like os.launch() or .launchfile()? But then you'd have reverse-compatibility issues. 

Why not just enhance os.startfile() so it doesn't barf if you try to use it on posix/mac? I'll try to contribute to the shutil.open() effort too.
msg159001 - (view) Author: Chris Rebert (cvrebert) * Date: 2012-04-23 08:04
Here's a quick stab at 2/3rds of an implementation, and some docs.
msg159004 - (view) Author: Hobs (Hobson.Lane) Date: 2012-04-23 10:29
Test passes on Ubuntu Oneiric Linux and 'open' action appropriately defaults to launching an editor for my particular OS settings.

Tests on Windows in work.
msg159005 - (view) Author: Hobs (Hobson.Lane) Date: 2012-04-23 10:39
Implement shutil.launch() & fix minor shutil.disk_usage() doctext typo

Name changed from shutil.open to shutil.launch due to namespace conflict with open() builtin within the shutil module and for users that do

    from shutil import *

On Ubuntu Oneiric Linux shutil.launch() doctest passes and `./python -m test -j3` doesn't change (OS-appropriate tests all pass).

Windows tests in work. Need Mac testing too.
msg159006 - (view) Author: Chris Rebert (cvrebert) * Date: 2012-04-23 11:30
> # or os.name == 'mac' ???

Nope, that refers to retro Mac OS 9 (and probably lower). Mac OS X is 'posix' for os.name purposes.
msg159007 - (view) Author: Chris Rebert (cvrebert) * Date: 2012-04-23 11:53
`operation` seems questionable. IMO, the verbs seem stronger / more important than mere optional suggestions (particularly "open" vs. "edit" for files with read-only viewers), and only Windows supports them (so anyone requiring that feature might as well just use startfile() directly). By virtue of this function being cross-platform, we're kinda limited to just supporting the lowest common denominator.

Hobs, can you explain `gui`?

Also, does startfile() raise exceptions for either of the basic error conditions ("no such file" and "no associated application")? If not, I believe using the lower-level ShellExecute (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153%28v=vs.85%29.aspx ) or similar Windows API function would allow us to report such errors, as the other platform implementations currently do.
msg159008 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2012-04-23 12:34
Is the error raising PEP 3151 compliant?
msg159009 - (view) Author: Chris Rebert (cvrebert) * Date: 2012-04-23 12:49
No, it isn't. Changing the `IOError(errno.ENOENT, "...`s to `FileNotFoundError("...`s would half fix it.

The other half, the `OSError(errno.ENOSYS)`s, has a FIXME for what's the right error to raise in that case ("no application associated with files of this type"). I have no idea myself. None of the new PEP 3151 errors apply. Nor did any of the errnos strictly speaking AFAICT; ENOSYS was the closest approximation I could find. Thoughts? Custom error class? Different errno? Something else?
msg159010 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2012-04-23 12:54
> ENOSYS was the closest approximation I could find. Thoughts? Custom
> error class? Different errno? Something else?

Why not ValueError?
msg159017 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2012-04-23 13:58
Thanks for relaunching this!

> I'm not sure I understand why this was moved to shutil.open. It seems appropriate to try to accomplish what
> os.startfile() does in a cross-platform way. Don't many of the other os.* calls do this--check os.name and
> then "do the right thing".
They don’t.  The os module is a thin wrapper on top of system functions.  Cross-platform compat is not achieved with os.name checks but with platform-specific code in the C files.  As Windows provides a call named startfile, it is exposed.  When we want to provide a higher-level API on top of system calls, we use other modules such as shutil.

> fix minor shutil.disk_usage() doctext typo
Would you report this on another bug report or simply with a mail to the docs@python.org mailing list?  Thanks.

> Name changed from shutil.open to shutil.launch due to namespace conflict with open() builtin within the shutil
> module and for users that do from shutil import *
I don’t think these are good arguments.  A lot of modules expose a function named open: tarfile, codecs, tokenize...  Python has namespaces, let’s use them.  The argument about import * is not strong either in my opinion, because all our docs recommend against this idiom.

One argument against open is that the other open functions I mention above return a file object, like the builtin open.  With this in mind I agree that a better name should be found.  I dislike launch though because it brings to my mind the idea of running/executing a program, not opening it in the appropriate program.
msg159020 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2012-04-23 14:12
Launch is far better than open for this, I think.  If someone can come up with an even better name, that would be good.  But I would not like to use open for this function, because it does not behave like other open functions.

The one exception I know of is webbrowser.  Webbrowser uses open, but the recommended way to call it is webbrowser.open(), which makes it clear you are opening it in the webbrowser (and opening the webbrowser if needed).  shutil.open would convey no such connotation, to my mind.  (Only windows does extension based application opening from the *shell* as far as I know.)

Perhaps 'wmopen' (for Window Manager Open)?
msg159029 - (view) Author: Hobs (Hobson.Lane) Date: 2012-04-23 15:25
Does no one like "os.startfile" as a home for this? Besides myself and the
original 2008 proposer, of course. Can anyone explain to us newbies why
it's a bad idea to have the cross-platform module do things identically
across platforms?

@David,

`shutils.wmopen` locks you into never implementing the shell application
launching option (`gui`=False in my crude implementation) that so many
projects need. Each project currently implements it in their own
nonstandard way (e.g. Mercurial and Bazaar), sometimes with not so `nice`
consequences.

You're right that only launching from Linux/Mac shell requires manual
selection of an app, but that's exactly the inconvenience that I was hoping
to solve. Many Ubuntu GUI apps use extensions and MIME-types (associated
with extensions) to recognize their files rather than probing magic
headers. Why shouldn't their shell apps be allowed a standard way to do the
same?

If I implemented *exactly* os.startfile() functionality across the 3 major
platforms, would that be enough to interest the community in an
os.startfile() refinement rather than a new shutils.launch()? I'd drop the
distracting `gui` option to make it completely identical, if that helps.
Or, if the community preferred I could *add* the `gui` option to
startfile() across the board so that even Windows users could have the
option of choosing to edit a file within their shell (if they've installed
such an editor, of course).

@Chris,

Thanks for the tip on where to find low level exception information in
Windows. Sounds like a good idea to try to be as identical to
os.startfile() as possible. But that's why I thought the `operation` option
would be attractive to the community.

I'll test on windows (unless someone else chimes in with Windows
experience) and see what I can learn about exceptions and what it would
take to make os.startfile() truly OS-agnostic, all the way down to each
exception raised.

`gui` allows the user to chose to launch a shell-based text editor (emacs,
vi/vim, nano, $EDITOR, based on user settings). It standardizes what bzr,
hg and other popular cross-platform python projects that launch shell
editors do already.

On Mon, Apr 23, 2012 at 10:12 PM, R. David Murray <report@bugs.python.org>wrote:

>
> R. David Murray <rdmurray@bitdance.com> added the comment:
>
> Launch is far better than open for this, I think.  If someone can come up
> with an even better name, that would be good.  But I would not like to use
> open for this function, because it does not behave like other open
> functions.
>
> The one exception I know of is webbrowser.  Webbrowser uses open, but the
> recommended way to call it is webbrowser.open(), which makes it clear you
> are opening it in the webbrowser (and opening the webbrowser if needed).
>  shutil.open would convey no such connotation, to my mind.  (Only windows
> does extension based application opening from the *shell* as far as I know.)
>
> Perhaps 'wmopen' (for Window Manager Open)?
>
> ----------
>
> _______________________________________
> Python tracker <report@bugs.python.org>
> <http://bugs.python.org/issue3177>
> _______________________________________
>
msg159030 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2012-04-23 15:26
Please trust us that this is our policy.  os is a thin wrapper only.
msg159034 - (view) Author: Hobs (Hobson.Lane) Date: 2012-04-23 15:52
@Éric

Thanks for clearing up my misunderstanding of os and shutil. I get it now.

I'm sure you know this, and it's clear you agree with changing the name,
but just to add fire to your resolve, the difference between shutil.open()
and the other `*.open()` modules you mention is that most of the others
began their life with `open()` in their namespace (I think). A new `open()`
in shutil, this late in its life, would break a *lot* of old code,
sometimes invisibly. Apps might launch invisibly on servers with X-windows
configured to display remotely, fail to raise exceptions, and leave a lot
of admins dumbfounded and cursing the python standard library migration.
Seems like pretty draconian punishment for bad (but not forbidden or
deprecated) idioms. I'd rather not have my code be one of the rocks in that
stoning. A few would surely fly my way.

On Mon, Apr 23, 2012 at 9:58 PM, Éric Araujo <report@bugs.python.org> wrote:

>
> Éric Araujo <merwok@netwok.org> added the comment:
>
> Thanks for relaunching this!
>
> > I'm not sure I understand why this was moved to shutil.open. It seems
> appropriate to try to accomplish what
> > os.startfile() does in a cross-platform way. Don't many of the other
> os.* calls do this--check os.name and
> > then "do the right thing".
> They don’t.  The os module is a thin wrapper on top of system functions.
>  Cross-platform compat is not achieved with os.name checks but with
> platform-specific code in the C files.  As Windows provides a call named
> startfile, it is exposed.  When we want to provide a higher-level API on
> top of system calls, we use other modules such as shutil.
>
> > fix minor shutil.disk_usage() doctext typo
> Would you report this on another bug report or simply with a mail to the
> docs@python.org mailing list?  Thanks.
>
> > Name changed from shutil.open to shutil.launch due to namespace conflict
> with open() builtin within the shutil
> > module and for users that do from shutil import *
> I don’t think these are good arguments.  A lot of modules expose a
> function named open: tarfile, codecs, tokenize...  Python has namespaces,
> let’s use them.  The argument about import * is not strong either in my
> opinion, because all our docs recommend against this idiom.
>
> One argument against open is that the other open functions I mention above
> return a file object, like the builtin open.  With this in mind I agree
> that a better name should be found.  I dislike launch though because it
> brings to my mind the idea of running/executing a program, not opening it
> in the appropriate program.
>
> ----------
>
> _______________________________________
> Python tracker <report@bugs.python.org>
> <http://bugs.python.org/issue3177>
> _______________________________________
>
msg159037 - (view) Author: Hobs (Hobson.Lane) Date: 2012-04-23 16:09
New patch incorporates improvements from pitrou, cvrebert, r.david.murray, eric.araujo, cool-RR
msg159038 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2012-04-23 16:12
Initially this issue was about implementing a startfile-equivalent on posix.  But if you have to add a gui option to startfile to not lanuch a GUI, and your real goal is a consistent way to launch non-gui programs on posix, then I don't see that this is about implementing startfile, and the enhancement should *definitely* not go in os.

Setting that aside for a moment, let me say something about the wrapper argument.  There *is* a lot of compatibility code in os.  We do have to jump through hoops to get posix equivalent functionality on Windows.  So doing the reverse to get windows-equivalent functionality on posix would seem fair turnabout.

However, it is also true that those hoops we jump through for windows involve calling Windows APIs (the equivalent of the posix system calls we are wrapping).  So while the hoops aren't necessarily all that "thin", they are wrappers around APIs at the OS level (thus the name of the module).  In this case the hoops are not system calls.  So even disregarding my initial comments above, while I don't think the argument is quite as clear cut as Éric does, I do think in this case the code, which is *not* operating at the C API level, does not belong in OS.

Finally, I'm still against shutil.open as the name.  It does not suggest to me that an application is being run.  (Neither does 'startfile', by the way).
msg159039 - (view) Author: Sven Marnach (smarnach) Date: 2012-04-23 16:15
The semantics of "associated application" change considerably from operating system to operating system.  As an example, ``os.startfile("a.py")`` will usually run `a.py` in the Python interpreter, while ``xdg-open a.py`` it will usually open the source code in an editor on Linux.  This might reduce the overall usefulness of the proposed ``shutil.launch()`` function.
msg159043 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2012-04-23 16:30
> The semantics of "associated application" change considerably from
> operating system to operating system.  As an example,
> ``os.startfile("a.py")`` will usually run `a.py` in the Python
> interpreter, while ``xdg-open a.py`` it will usually open the source
> code in an editor on Linux.

Outch.  I think the behavior should be more similar than that, i.e. that the function should use startfile with the edit action on Windows.

About the name: I thought about “edit”; it really means open_file_in_editor.  BTW shutil feels the wrong place for this but I don’t think we have anything better.
msg159044 - (view) Author: Hobs (Hobson.Lane) Date: 2012-04-23 16:34
Last patch was invalid and untested.

New patch passes `make patchtest`, but still doing the full test suite on Windows and Linux.

Still unsure if I raised the right exceptions with the right arguments.
msg159051 - (view) Author: Hobs (Hobson.Lane) Date: 2012-04-23 17:35
I'll be happy to code, test, and use the new ____.____() function wherever it ends up and whatever it is named... but...

> Initially this issue was about implementing a startfile-equivalent on
> posix.  But if you have to add a gui option to startfile to not lanuch > a GUI, and your real goal is a consistent way to launch non-gui 
> programs on posix

Actually, my real goal was a consistent way of launching any editor or viewer (or even interpreter) on any platform with graceful fallback from the caller's preferred action to the others. I wanted my application that called the new idiomatic standard library function to do something  smarter (in my mind) than what OSes do by default and more consistent and robust than what hg and bzr do by design. Perhaps the fallback should only be within the read/write/execute "silos", but that should be configurable as well, defaulting to do the safe thing (fallback within editors or within viewers only).

    GUI viewer (IE, then Firefox, then Chrome, then Safari)
    GUI editor (notepad, then ...)
    shell editor ($EDITOR, then vim, then vi, then nano, etc)
    shell viewer (less, then more, then cat)

Obviously this isn't feasible. At least not for my first patch.
msg159056 - (view) Author: Chris Rebert (cvrebert) * Date: 2012-04-23 17:53
>> ENOSYS was the closest approximation I could find. Thoughts? Custom
>> error class? Different errno? Something else?
>
> Why not ValueError?

Because the value they provided was perfectly valid (the file/directory *did* exist), so the caller's request was reasonable. It's the system(/ its (lack of) configuration) that failed the caller in finding an opener application. The "fix" after encountering the exception is to add an association to the system configuration (and/or install a new application), not to pass a different path to the function.

IMO, it feels like an EnvironmentError or RuntimeError of some sort; hence the current use of OSError.
(Or NotImplementedError, but we're already using that exception to indicate a different failure condition, so that's out.)
msg159058 - (view) Author: Chris Rebert (cvrebert) * Date: 2012-04-23 17:58
Hobs, why is exit code 4 of xdg-open (which the manpage describes as the extremely generic "The action failed.") interpreted as FileNotFoundError in your new version?
msg159059 - (view) Author: Hobs (Hobson.Lane) Date: 2012-04-23 18:05
Because that's how I caused the exception in
Ubuntu--shutil.launch('file_that_doesnt_exist'). That's why I changed the
message to "file may not exist" for both 2 and 4, but should probably prove
that 2 sometimes happens when the file does exist (like with permission or
visiblity/hidden errors in some OSes).

Interestingly I got it to quietly, insidiously fail on Ubuntu by passing it
a path to an empty file named empty.exe with the executeable bit set (but
permissions and executable bit didn't seem to make a difference). No app
was launched (or too quickly disappeared for me to see) and shutil.launch()
did not complain.

On Tue, Apr 24, 2012 at 1:58 AM, Chris Rebert <report@bugs.python.org>wrote:

>
> Chris Rebert <pybugs@rebertia.com> added the comment:
>
> Hobs, why is exit code 4 of xdg-open (which the manpage describes as the
> extremely generic "The action failed.") interpreted as FileNotFoundError in
> your new version?
>
> ----------
>
> _______________________________________
> Python tracker <report@bugs.python.org>
> <http://bugs.python.org/issue3177>
> _______________________________________
>
msg159062 - (view) Author: Chris Rebert (cvrebert) * Date: 2012-04-23 18:09
Also:

The FileNotFoundErrors quote the path twice:
    Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53) 
    >>> path = "/foo/bar"
    >>> print "Path '%s' may not exist" % repr(path)
    Path ''/foo/bar'' may not exist

The ValueError error message isn't grammatically correct and doesn't account for the possibility that the path is a directory (consider the case of a Unix system where the GUI file manager has been uninstalled; directories would then fail to open). May I suggest my original message?: "No application is associated with files/directories of the given type"
msg159063 - (view) Author: Chris Rebert (cvrebert) * Date: 2012-04-23 18:21
The xdg-open source code (http://cgit.freedesktop.org/xdg/xdg-utils/tree/scripts/xdg-open ) shows that exit code 4 is used whenever an invocation of another opener script (e.g. kde-open, gnome-open) fails for any reason besides said script not being installed. So I'm not so sure we can jump to the conclusion that 4 automatically means FileNotFound.
msg159064 - (view) Author: Hobs (Hobson.Lane) Date: 2012-04-23 18:33
Yea, I hosed up the path quoting in a misguided attempt at shortening for
80-col line-wrapping. Yours is better, will revert.

On Tue, Apr 24, 2012 at 2:09 AM, Chris Rebert <report@bugs.python.org>wrote:

>
> Chris Rebert <pybugs@rebertia.com> added the comment:
>
> Also:
>
> The FileNotFoundErrors quote the path twice:
>    Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53)
>    >>> path = "/foo/bar"
>    >>> print "Path '%s' may not exist" % repr(path)
>    Path ''/foo/bar'' may not exist
>
> The ValueError error message isn't grammatically correct and doesn't
> account for the possibility that the path is a directory (consider the case
> of a Unix system where the GUI file manager has been uninstalled;
> directories would then fail to open). May I suggest my original message?:
> "No application is associated with files/directories of the given type"
>
> ----------
>
> _______________________________________
> Python tracker <report@bugs.python.org>
> <http://bugs.python.org/issue3177>
> _______________________________________
>
msg159065 - (view) Author: Chris Rebert (cvrebert) * Date: 2012-04-23 18:45
>> The semantics of "associated application" change considerably from
>> operating system to operating system.  As an example,
>> ``os.startfile("a.py")`` will usually run `a.py` in the Python
>> interpreter, while ``xdg-open a.py`` it will usually open the source
>> code in an editor on Linux.
>
> Outch.  I think the behavior should be more similar than that, i.e. that the function should use startfile with the edit action on Windows.

It's a universal problem on all 3 platforms. Given a script file argument, a generic "open" (as opposed to "edit") procedure will either run the script or open it in an editor, depending entirely upon the user's system configuration. Same thing happens when double-clicking a script in the file manager, which is IMO what we're trying to emulate here.

It sounds like some people want a generic "(text) edit" procedure, which IMO is different enough to warrant a separate bug since there are different/more design issues to tackle (e.g. if someone edit()s an image file (or a file of uncertain type) on Unix, what application is opened, and how is that determined?). And no peeking at Mercurial's code; it's under GPLv2, whereas Python is under BSD/MIT-like licensing, making them incompatible.
msg159068 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2012-04-23 19:37
I'm not a lawyer (duh), but my understanding is that *looking* at GPL code (as opposed to proprietary code, where someone might sue you about it and not looking is a good defense) is OK, you just can't copy it.
msg159069 - (view) Author: Antoine Pitrou (pitrou) * (Python committer) Date: 2012-04-23 19:47
> I'm not a lawyer (duh), but my understanding is that *looking* at GPL
> code (as opposed to proprietary code, where someone might sue you
> about it and not looking is a good defense) is OK, you just can't copy
> it.

You could probably copy a one- or two-liner, especially if it's not a
very creative one.
By that I mean that putting "i = i + 1" under the GPL is not enough to
prevent anyone else to write the same line of code :-)
msg159121 - (view) Author: Hobs (Hobson.Lane) Date: 2012-04-24 07:14
I can see why this partial implementation of `operation` in this ver seems
useless. But it is a placeholder for eventually providing Linux/Mac users
with the same functionality as windows. The os.startfile() or
shutil.launch() function can easily fill the gap left by the OS, which is
what os does for lots of other missing  OS features on one platform or
another.

I'll delete the OS9 ('mac') test comment and leave an implementation for
those platforms up to others?

`gui` is for software that intends to launch user's $EDITOR, vi, nano,
emacs, etc. This is intended to generalize startfile to encompass a common
pattern, e.g. in bzr, hg. Perhaps it doesn't belong in ver1 until we sort
out all the other uncomfortable things about this patch.

I'll test all the windows and linux exception possabilities and get back to
you on what exceptions startfile() normally raises, and whether this
implementation of shutil.launch() raises comparable exceptions.

Cheers,
H
On Apr 23, 2012 7:53 PM, "Chris Rebert" <report@bugs.python.org> wrote:

>
> Chris Rebert <pybugs@rebertia.com> added the comment:
>
> `operation` seems questionable. IMO, the verbs seem stronger / more
> important than mere optional suggestions (particularly "open" vs. "edit"
> for files with read-only viewers), and only Windows supports them (so
> anyone requiring that feature might as well just use startfile() directly).
> By virtue of this function being cross-platform, we're kinda limited to
> just supporting the lowest common denominator.
>
> Hobs, can you explain `gui`?
>
> Also, does startfile() raise exceptions for either of the basic error
> conditions ("no such file" and "no associated application")? If not, I
> believe using the lower-level ShellExecute (
> http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153%28v=vs.85%29.aspx) or similar Windows API function would allow us to report such errors, as
> the other platform implementations currently do.
>
> ----------
>
> _______________________________________
> Python tracker <report@bugs.python.org>
> <http://bugs.python.org/issue3177>
> _______________________________________
>
msg159505 - (view) Author: Miki Tebeka (tebeka) * Date: 2012-04-27 22:54
Just to note there's http://pypi.python.org/pypi/desktop/0.4 out there.
msg159507 - (view) Author: Hobs (Hobson.Lane) Date: 2012-04-28 00:15
Had no idea. Sounds like a good place for it.
On Apr 28, 2012 6:54 AM, "Miki Tebeka" <report@bugs.python.org> wrote:

>
> Miki Tebeka <miki.tebeka@gmail.com> added the comment:
>
> Just to note there's http://pypi.python.org/pypi/desktop/0.4 out there.
>
> ----------
> nosy: +tebeka
>
> _______________________________________
> Python tracker <report@bugs.python.org>
> <http://bugs.python.org/issue3177>
> _______________________________________
>
msg161569 - (view) Author: Larry Hastings (larry) * (Python committer) Date: 2012-05-25 11:40
> As an example, ``os.startfile("a.py")`` will usually run `a.py`
> in the Python interpreter, while ``xdg-open a.py`` it will
> usually open the source code in an editor on Linux.

Well, so how about on UNIX shutil.launch (or whatever it's called) first checks to see if we're referring to a file.  If we are, check to see if it's marked executable.  If it is, execute it under a shell.  Failing *that* we could run xdg-open where available.
msg161613 - (view) Author: Hobs (Hobson.Lane) Date: 2012-05-25 19:50
Could even add an `operation` parameter to let the caller select actions,
including 'auto'  implemented as Larry suggests. Sometimes you feel like
trusting the user's xdg-open preferences/settings. Sometimes you don't.
Easy enough to let the caller choose, rather than the OS.

    operation in ['auto', 'run', 'edit', 'display', 'browse', 'explore',
'share', 'send', 'like', 'email', 'open', 'xdg-open', ...] # can
be incrementally added/implemented

Each op requires 1 conditional and gives a lot more utility without
requiring much more launch/action code that hasn't already been
tested/debugged on all relevant platforms. And the `operation` parameter is
a semi-standard used by MS, easing the transition for Win-devs migrating
gui code to python and linux (or cross-platform implementations).

On Fri, May 25, 2012 at 4:40 AM, Larry Hastings <report@bugs.python.org>wrote:

>
> Larry Hastings <larry@hastings.org> added the comment:
>
> > As an example, ``os.startfile("a.py")`` will usually run `a.py`
> > in the Python interpreter, while ``xdg-open a.py`` it will
> > usually open the source code in an editor on Linux.
>
> Well, so how about on UNIX shutil.launch (or whatever it's called) first
> checks to see if we're referring to a file.  If we are, check to see if
> it's marked executable.  If it is, execute it under a shell.  Failing
> *that* we could run xdg-open where available.
>
> ----------
> nosy: +larry
>
> _______________________________________
> Python tracker <report@bugs.python.org>
> <http://bugs.python.org/issue3177>
> _______________________________________
>
msg161631 - (view) Author: Larry Hastings (larry) * (Python committer) Date: 2012-05-26 00:08
> Could even add an `operation` parameter to let the caller
> select actions,
> [...]
> operation in ['auto', 'run', 'edit', 'display', 'browse',
> 'explore', 'share', 'send', 'like', 'email', 'open', 'xdg-open',
> ...] # can be incrementally added/implemented

IIRC ShellExecute on Windows has support for verbs like this.  But how would we implement support for "explore" / "share" / "send" / "like" on Mac OS X and Linux?

The only flag I can think of supporting in a cross-platform way would be "execute=True", which on Windows would mean try the verb "run" before trying the default, and on OS X and Linux would mean look for the execute bit / the "#!" signature and run it if possible first before using "xdg-open".
msg161687 - (view) Author: Hobs (Hobson.Lane) Date: 2012-05-26 22:39
In Linux we could `try` nautilus then Mozilla
(file://.../containing_folder) then fall back to a shell `cd && ls` if no
browser is available, raising NotImplemented if all else fails... until
someone implements for that user's platform particulars. Likewise on OSX,
Mac, even iOS, Android, etc.

That way the API remains fixed and implementation can mature without
breaking it, as people think of or develop new cross-platform actions that
you and I can't even dream of now. A boolean `execute` flag is
unnecessarily specialized (not generalized or flexible).

--Hobson
On May 25, 2012 5:08 PM, "Larry Hastings" <report@bugs.python.org> wrote:

>
> Larry Hastings <larry@hastings.org> added the comment:
>
> > Could even add an `operation` parameter to let the caller
> > select actions,
> > [...]
> > operation in ['auto', 'run', 'edit', 'display', 'browse',
> > 'explore', 'share', 'send', 'like', 'email', 'open', 'xdg-open',
> > ...] # can be incrementally added/implemented
>
> IIRC ShellExecute on Windows has support for verbs like this.  But how
> would we implement support for "explore" / "share" / "send" / "like" on Mac
> OS X and Linux?
>
> The only flag I can think of supporting in a cross-platform way would be
> "execute=True", which on Windows would mean try the verb "run" before
> trying the default, and on OS X and Linux would mean look for the execute
> bit / the "#!" signature and run it if possible first before using
> "xdg-open".
>
> ----------
>
> _______________________________________
> Python tracker <report@bugs.python.org>
> <http://bugs.python.org/issue3177>
> _______________________________________
>
msg161688 - (view) Author: Larry Hastings (larry) * (Python committer) Date: 2012-05-26 23:00
> In Linux we could `try` nautilus then Mozilla
> (file://.../containing_folder) then fall back to a shell
> `cd && ls` if no browser is available, raising NotImplemented
> if all else fails... until someone implements for that
> user's platform particulars.

What if they're using a KDE-based system?  Or XFCE?  Or xmonad?  Or qtile?
What if their preferred file browser is Midnight Commander?
What if they use Chrome?  Or Konqueror?  Or Opera?  Or Lynx?

Designing a cross-platform API based on abilities provided by only one of those platforms, then waiving your hand and saying "I'm sure the other platforms will add this functionality sometime", is poor cross-platform API design.  OS X is 11 years old, GNOME is 13, KDE is 16, and none of the above appear to be in a hurry to add this feature.  And even on Windows, which has had this feature for 17 years (IIRC it was introduced with Windows 95)... it is hardly ever used.  99.999% of the time you simply want to "open" the file using the user's preferred app.

Since Windows users already have an API to access this extra functionality on their platform (os.startfile) I assert that the cross-platform API should only expose the functionality that's available across platforms.  Hence my proposal for "execute".
msg161837 - (view) Author: Hobs (Hobson.Lane) Date: 2012-05-29 02:18
Then they or we can add Konqueror, etc to the options that are 'try'ed for
the 'view' option. Worst case they get a terminal cat of the file instead
of an error message or unintended action (like running a script). What
exactly are you proposing to do when execute is False? That's exactly what
the augmented launch function would do when the "open" or "view" option is
chosen. Anything else for the other options like "edit" or "email" is just
gravy (for application developers targeting the 90% of platforms that we
could easily anticipate).

Gnome/KDE Xdg-open, Android "Share", Windows Open, already do implement
more than we need. Like your "execute" flag, I'm suggesting we bypass all
that unpredictable open() stuff and allow the application developer to
chose what happens when they launch a file. It would allow the app
developer to stay out of the tug-of war between PC manufacturers, OS
manufacturers, and Internet service providers trying to set "preferred
applications" and steering customers to their products.

But clearly you have passion for the boolean execute flag, and you probably
have more experience with python standard libraries than I do, so go for
it. I like your "execute" option. Just thought you'd like to extend it to
include other options. I'm happy with my cross-platform home-rolled
launch() function for my apps that can't afford to leave launch() actions
up to chance.

On Sat, May 26, 2012 at 4:00 PM, Larry Hastings <report@bugs.python.org>wrote:

>
> Larry Hastings <larry@hastings.org> added the comment:
>
> > In Linux we could `try` nautilus then Mozilla
> > (file://.../containing_folder) then fall back to a shell
> > `cd && ls` if no browser is available, raising NotImplemented
> > if all else fails... until someone implements for that
> > user's platform particulars.
>
>  Designing a cross-platform API based on abilities provided by only one of
> those platforms, then waiving your hand and saying , is poor cross-platform
> API design.  OS X is 11 years old, GNOME is 13, KDE is 16, and none of the
> above appear to be in a hurry to add this feature.  And even on Windows,
> which has had this feature for 17 years (IIRC it was introduced with
> Windows 95)... it is hardly ever used.  99.999% of the time you simply want
> to "open" the file using the user's preferred app.
>
> Since Windows users already have an API to access this extra functionality
> on their platform (os.startfile) I assert that the cross-platform API
> should only expose the functionality that's available across platforms.
>  Hence my proposal for "execute".
>
> ----------
>
> _______________________________________
> Python tracker <report@bugs.python.org>
> <http://bugs.python.org/issue3177>
> _______________________________________
>
msg161852 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2012-05-29 05:11
The latest discussion on this thread does not match my UNIX user model.

tl;dr: shutil.whatever should call startfile(..., 'edit') or xdg-open; other actions implemented by startfile are not cross-platform.

> Well, so how about on UNIX shutil.launch (or whatever it's called) first checks to see if we're
> referring to a file.  If we are, check to see if it's marked executable.  If it is, execute it
> under a shell.  Failing *that* we could run xdg-open where available.
This makes sense from an os.startfile perspective, but not for an xdg-open user.  xdg-open (and shutil.whatever in my eyes) only starts an application with the passed argument; that’s it.  There is no execute action because that’s done otherwise (in Python, with subprocess and os.exec*; in the shell, with program invocation (i.e. “program” or “/full/path/to/file”) using shebangs or binfmt-format).  So in my mental model, using xdg-open to have a file or URI opened by a configured application (which can be graphical or command-line) has nothing to do with executing a file.

(There was an older system on UNIX named mailcap where you could register console and GUI actions for different actions, like edit and print, but it’s not used by current graphical mail clients like Thunderbird or by the xdg-open system, so I would not consider it at all.)
msg161853 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2012-05-29 05:13
Note that my suggestion has an inconvenient on Windows.  Take the example of HTML files; on an UNIX system I would decide whether I want them to be opened with my text editor or my web browser; I’d choose web browser because I launch my text editor from a shell.  On Windows though you would register your web browser for default action and your text editor for the edit action; this deliberate configuration would not be respected if we implement shutil.whatever with os.startfile(..., 'edit').
msg161854 - (view) Author: Éric Araujo (eric.araujo) * (Python committer) Date: 2012-05-29 05:15
(A last, very minor thing: please trim or remove quoted text when replying with the email interface (or on mailing lists); it puts unneeded wall of texts that reader waste time scanning, in case there were inline replies.  Thanks in advance.)
msg161858 - (view) Author: Hobs (Hobson.Lane) Date: 2012-05-29 07:45
shutil.whatever with os.startfile(..., 'edit').

That's why I thought an 'auto' option might be useful--to allow the caller
to indicate that they want to respect the OS settings for open/run, if
possible.
msg167011 - (view) Author: Ronald Oussoren (ronaldoussoren) * (Python committer) Date: 2012-07-31 16:03
MacOSX provides functionality simular to os.startfile in the LaunchServices framework. 

I've tried to prototype a startfile implementation using this framework, (see issue3177-os_startfile_macosx.txt) but I'm not too happy about it because the APIs don't actually work as expected.

In particular:

* The patch implements "open" (default), "edit", "print" and
  "explore" actions.

* "open" and "explore" work fine

* "edit" does not work as I'd expect because the function used
   to retrieve the default editor for a file returns the default
   application that can open the file, not necessarily one that
   claims to be an editor for the file-type. As an example, 
   'os.startfile("file.html", "edit")' starts Safari instead of
   an editor.

* "print" works for some file type, but not others (depending on 
  whether or not the target application implements the required
  AppleScript API)

* "execute" is untested, I haven't found an application yet that claims
  this role.

Other notes:

* This patch links Python with the ApplicationServices framework
  (which contains the LaunchServices framework)

* Because the API uses Apple's application frameworks users might get
  annoying crashes when calling this function in a subprocess.

* The code attached code is a prototype, it should be correct w.r.t.
  resource management, but isn't fully baked yet. One example of that
  is the use of a generic RuntimeError exception to signal problems,
  others are the lack of documentation and tests.
History
Date User Action Args
2012-07-31 16:03:34ronaldoussorensetfiles: + issue3177-os_startfile_macosx.txt
nosy: + ronaldoussoren
messages: + msg167011

2012-05-29 07:45:41Hobson.Lanesetmessages: + msg161858
2012-05-29 05:15:44eric.araujosetmessages: + msg161854
2012-05-29 05:13:48eric.araujosetmessages: + msg161853
2012-05-29 05:11:11eric.araujosetmessages: + msg161852
2012-05-29 02:18:39Hobson.Lanesetmessages: + msg161837
2012-05-26 23:00:15larrysetmessages: + msg161688
2012-05-26 22:39:24Hobson.Lanesetmessages: + msg161687
2012-05-26 00:08:57larrysetmessages: + msg161631
2012-05-25 19:50:47Hobson.Lanesetmessages: + msg161613
2012-05-25 11:40:02larrysetnosy: + larry
messages: + msg161569
2012-04-28 00:15:32Hobson.Lanesetmessages: + msg159507
2012-04-27 22:54:08tebekasetnosy: + tebeka
messages: + msg159505
2012-04-24 07:14:06Hobson.Lanesetmessages: + msg159121
2012-04-23 23:53:32cvrebertsetfiles: + shutil_open.patch
2012-04-23 21:12:08hayposetnosy: - haypo
2012-04-23 19:47:40pitrousetmessages: + msg159069
2012-04-23 19:37:01r.david.murraysetmessages: + msg159068
2012-04-23 18:45:38cvrebertsetmessages: + msg159065
2012-04-23 18:33:03Hobson.Lanesetmessages: + msg159064
2012-04-23 18:21:33cvrebertsetmessages: + msg159063
2012-04-23 18:09:36cvrebertsetmessages: + msg159062
2012-04-23 18:05:41Hobson.Lanesetmessages: + msg159059
2012-04-23 17:58:17cvrebertsetmessages: + msg159058
2012-04-23 17:53:02cvrebertsetmessages: + msg159056
2012-04-23 17:35:04Hobson.Lanesetfiles: + shutil_open.patch

messages: + msg159051
2012-04-23 16:34:07Hobson.Lanesetfiles: + shutil_open.patch

messages: + msg159044
2012-04-23 16:30:09eric.araujosetmessages: + msg159043
2012-04-23 16:15:23smarnachsetnosy: + smarnach
messages: + msg159039
2012-04-23 16:12:39r.david.murraysetmessages: + msg159038
2012-04-23 16:09:45Hobson.Lanesetfiles: + shutil_open.patch

messages: + msg159037
2012-04-23 15:52:09Hobson.Lanesetmessages: + msg159034
2012-04-23 15:26:40eric.araujosetmessages: + msg159030
2012-04-23 15:25:01Hobson.Lanesetmessages: + msg159029
2012-04-23 14:12:57r.david.murraysetmessages: + msg159020
2012-04-23 13:58:38eric.araujosetmessages: + msg159017
2012-04-23 12:54:40pitrousetnosy: + pitrou
messages: + msg159010
2012-04-23 12:49:07cvrebertsetmessages: + msg159009
2012-04-23 12:34:34r.david.murraysetmessages: + msg159008
2012-04-23 12:25:44r.david.murraysetnosy: + r.david.murray
2012-04-23 12:20:53cool-RRsetnosy: - cool-RR
2012-04-23 11:53:32cvrebertsetmessages: + msg159007
2012-04-23 11:30:44cvrebertsetmessages: + msg159006
2012-04-23 10:39:45Hobson.Lanesetfiles: + shutil_open.patch

messages: + msg159005
2012-04-23 10:29:21Hobson.Lanesetfiles: + shutil_launch.py

messages: + msg159004
2012-04-23 08:04:32cvrebertsetfiles: + shutil_open.py

messages: + msg159001
2012-04-23 05:52:52Hobson.Lanesetnosy: + Hobson.Lane
messages: + msg159000
2012-04-01 06:31:35cvrebertsetmessages: + msg157258
2012-04-01 03:20:02Arfreversetnosy: + Arfrever
2012-04-01 01:01:40eric.araujosetdependencies: - Finding programs in PATH, adding shutil.which
messages: + msg157247
2012-04-01 00:50:07hayposetmessages: + msg157246
2012-03-31 17:51:04cvrebertsetmessages: + msg157216
2011-07-31 02:39:08Roman.Evstifeevsetnosy: + Roman.Evstifeev
2011-07-15 15:25:48eric.araujosetmessages: + msg140419
2011-07-15 15:20:41eric.araujosetmessages: + msg140418
2011-07-15 15:19:26hayposetnosy: + haypo
messages: + msg140416
2011-07-15 15:13:44eric.araujosetdependencies: + Finding programs in PATH, adding shutil.which
messages: + msg140415
title: implement os.startfile on posix and MacOSX -> Add shutil.open
2011-07-13 16:23:39cool-RRsetmessages: + msg140283
2011-07-13 16:06:25eric.araujosetmessages: + msg140280
2011-07-13 15:41:54giampaolo.rodolasetmessages: + msg140276
2011-07-13 15:39:33eric.araujosetnosy: + eric.araujo
messages: + msg140275
2011-07-10 08:36:52cvrebertsetnosy: + cvrebert
2011-07-09 12:16:05cool-RRsetnosy: + cool-RR
2011-07-09 12:15:24rosslagerwallsetnosy: + rosslagerwall

messages: + msg140059
versions: + Python 3.3, - Python 3.2
2010-08-21 23:00:58georg.brandlsetversions: + Python 3.2, - Python 2.7
2008-06-24 11:52:19giampaolo.rodolasetnosy: + giampaolo.rodola
2008-06-24 02:34:22ganadistsetfiles: + os_startfile.diff
keywords: + patch
messages: + msg68664
2008-06-23 21:32:49benjamin.petersonsetpriority: low
nosy: + benjamin.peterson
title: os.startfile implement in posix and MacOSX -> implement os.startfile on posix and MacOSX
messages: + msg68650
versions: + Python 2.7
2008-06-23 11:38:24ganadistcreate