Sau khi chuyển từ optparse sang argparse - Tôi gặp phải lỗi lạ. Argparse phân tích args chỉ khi rời khỏi không gian:Python: chuyển từ optparse sang argparse
myScript.py -oOpt
hoặc đặt một dấu bằng:
myScript.py -o=Opt
và nó không hoạt động theo cách thông thường:
myScript.py -o Opt
Dưới đây là khởi argparse của tôi :
#!/usr/bin/env python
# to get description use the -h flag
import argparse, os, sys
# ======================
# Python2.7 is expected:
if sys.version_info[0] != 2 or sys.version_info[1] < 7:
sys.exit('This program needs Python2.7+')
# ==========
# preambule:
desc = """Enter dirs in the current dir and makes gro out of state.cpt there."""
# parser = argparse.ArgumentParser()
parser = argparse.ArgumentParser(description=desc, version='2.3', formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument('-w', '--workWith',
help = 'to specify a Gromacs exec suffix',
dest = 'wW',
action = 'store',
default = '-4.5.5-single',
)
parser.add_argument('-g', '--gro',
help = '.gro postfix: <nameOfTheDir><postfix>.gro',
dest = 'myGroPostfix',
action = 'store',
default = "_membrane",
)
parser.add_argument('-H', '--here',
help = 'toggles - single (current) dir behaviour (the output will be state.gro)',
dest = 'Here',
action = 'store_true',
)
parser.add_argument('-D', '--dirs',
help = 'include these dirs (python\'s rgxp in SINGLE quotes), defaults to \'\'',
dest = 'inclDirs',
action = 'store',
default = '',
)
args = parser.parse_args()
print args.wW
Sửa:
Thậm chí nhiều hơn:
gmx_bk-simulate-mems.py -j bk-runs-mpi.bash -p 1 -w="-4.5.5-double_non-parallel_gcc" 2&> ../`date +%Y-%b-%d-%H%M%S`.log &
cho:
gmx_bk-simulate-mems.py: error: unrecognized arguments: 2
nó trông giống như argparse
xử lý 2&>
như tùy chọn (hoặc 2&>
và ../date +%Y-%b-%d-%H%M%S.log
như tùy chọn)!
Chỉnh sửa 2:
Vì vậy, để tóm tắt:
Đối
argparse
-"-4.5.5-double_non-parallel_gcc"
là một cái tên tùy chọn xấu - và đó là lý do tại sao nó là cần thiết để viết là như-w="-4.5.5-double_non-parallel_gcc"
. Đối vớioptparse
vàbash
(!) Điều này là tốt.bash
thậm chí có lỗi tại-w="-4.5.5-double_non-parallel_gcc"
- nó cho rằng arg là="-4.5.5-double_non-parallel_gcc"
(!);Không có điều nào như
2&>
.2>
có thể được sử dụng và không có lỗi;Đây là
shell
người chia dòng thành args, chứ không phảipython
;argparse
tốt hơn nhiều so vớioptparse
.
Đặt mã của bạn trong 'tmp.py', cả hai 'python tmp.py -w3' và' python tmp.py -w 3' in' 3 'cho tôi. – chepner
@chepner: vâng ... thực ra vấn đề cho dòng 75 trong [gmx_bk-get-results.bash] (https://github.com/bk322/bk-bio/blob/master/gmx_bk-get-results .bash): nếu một người loại bỏ '=' khỏi dòng đó - tập lệnh đưa ra lỗi - như thể tôi không cho nó '" $ wW "'. Để tái tạo một nhu cầu cũng phải nhận được [bk-copies-from-dirs.py] (https://github.com/bk322/bk-goodies/blob/master/bk-copies-from-dirs.py) và [gmx_bk-cpt2gmx.py] (https://github.com/bk322/bk-bio/blob/master/gmx_bk-cpt2gmx.py) ... Mọi thứ đều hoạt động tốt trên 'optparse'. Tôi hy vọng ai đó sẽ thấy vấn đề "về mặt lý thuyết". – Adobe
Nhận xét giả tạo: Bạn không cần trình kiểm tra phiên bản. Nếu bạn sử dụng Python 3, câu lệnh in ở phía dưới sẽ gây ra lỗi cú pháp và tập lệnh sẽ không được tải. Nếu bạn sử dụng Python 2.6 hoặc thấp hơn, tập lệnh sẽ thất bại khi nhập 'argparse', trước khi bạn thậm chí có thể kiểm tra phiên bản. – HardlyKnowEm