This issue tracker has been migrated to GitHub ,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2012年09月07日 00:04 by ZhuangZi, last changed 2022年04月11日 14:57 by admin. This issue is now closed.
| Messages (6) | |||
|---|---|---|---|
| msg169958 - (view) | Author: Nat Hillard (ZhuangZi) | Date: 2012年09月07日 00:04 | |
When using the argparse argument fromfile_prefix_chars to obtain command line arguments from a file, it is not possible to make use of bash environment variables within this file. Ideally one would be able to `export BAR='/Users/x/Desktop/bar'`, and then give arguments such as: --foo $BAR and have this correctly expanded at read time to --foo '/Users/x/Desktop/bar'. To my knowledge, this is currently only possible if you give the arguments directly via the command line: python test.py --foo $BAR It would be great to be able to use environment variables within files as well! |
|||
| msg169965 - (view) | Author: R. David Murray (r.david.murray) * (Python committer) | Date: 2012年09月07日 01:38 | |
I'm not sure this is a good idea. $BAR is supported on the command line because your shell supports it. To support it in files, argparse would have to (re)implement shell parsing, and while we do have a parser in the stdlib that can do some of this (shlex), actually implementing environment variable substitution correctly would be a non-trivial undertaking. And what about the csh users? (Assuming there are any left :) |
|||
| msg169969 - (view) | Author: Nat Hillard (ZhuangZi) | Date: 2012年09月07日 02:55 | |
Indeed these are all valid points, and as a zsh user myself I certainly considered the alternative shell issue. That said, if it were at all possible, through a combination of os.environ / shlex, subprocess, and even `source` if necessary, to offload this interpretation to the user's shell (pass the shell a given string, receive its interpretation first before further processing), I could see a lot of benefit from this. Relatedly, I have seem similar requests for environment variable support in configparser, here: http://grokbase.com/t/python/python-list/03ckhw75xr/parsing-environment-variables-in-configparser-files This particular proposal is interesting in that it creates an intermediary between the file's environment variable syntax and the shell's own. Presumably if you standardized the presentation of environment variables within this file you could use os.environ once you had recognized it. That said, I can understand, however, if this is prohibitively costly to implement, and it may well be that this option is ill suited to the task I am putting it to. |
|||
| msg169979 - (view) | Author: Steven Bethard (bethard) * (Python committer) | Date: 2012年09月07日 07:29 | |
You could try declaring a type converter and using the type= parameter of add_argument. Your type converter could look something like: def expanded_path(arg): return os.path.expandvars(arg) Would that work? |
|||
| msg169988 - (view) | Author: R. David Murray (r.david.murray) * (Python committer) | Date: 2012年09月07日 16:23 | |
I had forgotten all about os.path.expandvars. Note, however, that that function is very naive:
>>> os.path.expandvars("'$HOME'")
"'/home/rdmurray'"
That is, it is doing unconditional substitution, not parsing shell syntax. It should work well for simple cases, though.
It might be worth throwing up a trial balloon on python-ideas for adding something to shlex that would do a "better" job of environment variable substitution for the version of shell syntax that shlex supports, which would therefore become a sort of platform-independent syntax for doing this.
|
|||
| msg170213 - (view) | Author: Nat Hillard (ZhuangZi) | Date: 2012年09月10日 18:36 | |
Thank you, everyone. Defining a new type for this is just what I needed. No additional modifications are necessary on top of this new type. |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:57:35 | admin | set | github: 60078 |
| 2012年09月10日 18:36:33 | ZhuangZi | set | status: open -> closed resolution: works for me messages: + msg170213 |
| 2012年09月07日 16:23:54 | r.david.murray | set | messages: + msg169988 |
| 2012年09月07日 07:29:13 | bethard | set | messages: + msg169979 |
| 2012年09月07日 02:55:26 | ZhuangZi | set | messages:
+ msg169969 title: argparse cannot parse bash variable arguments in file-given arguments -> argparse cannot parse shell variable arguments in file-given arguments |
| 2012年09月07日 01:38:18 | r.david.murray | set | versions:
+ Python 3.4, - Python 2.7 nosy: + r.david.murray messages: + msg169965 type: behavior -> enhancement |
| 2012年09月07日 00:04:51 | ZhuangZi | create | |