Sorry if the title is not descriptive enough. When I try to execute a program from a directory which contains an `__main__.py` file, argparse fails to detect programs name. For example: $ ls foo __main__.py $ python3 foo usage: foo [-h] [-c COUNT] length foo: error: the following arguments are required: length $ python3 foo/ usage: [-h] [-c COUNT] length : error: the following arguments are required: length ---- >>> argparse.__version__ '1.1' I followed same steps using Python 2.7.6 and got same result. It will probably be same on other versions too. Same result can also be obtained when using zip files instead of directories. I don't know if this is a bug since I don't know if I do something wrong or is this a design decision or not. Thank you, Bora
I think this was just overlooked when implementing argparse. Most code out there is likely to get the executable name using: os.path.basename(sys.argv[0]) Which is going to do exactly what you are seeing here when sys.argv[0] ends with a /. feel free to submit a patch. perhaps as simple as this? os.path.basename(sys.argv[0].rstrip(os.path.sep)) But I'd expect a bunch of other code out there to have the same problem.
> I think this was just overlooked when implementing argparse. Most code out there is likely to get the executable name using: > > os.path.basename(sys.argv[0]) > > Which is going to do exactly what you are seeing here when sys.argv[0] ends with a /. > > feel free to submit a patch. perhaps as simple as this? > > os.path.basename(sys.argv[0].rstrip(os.path.sep)) > > But I'd expect a bunch of other code out there to have the same problem. It is exactly as you said: https://hg.python.org/cpython/file/3.4/Lib/argparse.py#l1619 Patch included. Created and tested using latest source at https://hg.python.org/cpython/.
> Thanks for the patch. We'll want a unit test for the behavior before committing this. You're welcome. Since I have no experience in writing unit tests, I don't really know where to start but I will try to do my best. I added bethard to the Nosy List, as he is the author of argparse's test. (In addition, you may want to change cpython/Lib/test/test_argparse.py:2163 )
This overlaps with http://bugs.python.org/issue22240 argparse support for "python -m module" in help This issue also tries to handle zip files as well. Deducing the `prog` was moved to a separate function. One challenge with that issue was constructing a test framework. Here the testing might simpler since the `foo/` directory doesn't have to exist (or at least we can fake it with a custom `sys.argv`).