python: 停止导入的模块解析命令行参数
python: stop imported module from parsing command line arguments
我正在使用外部 python 模块,该模块不是我编写的,因此无法更改。这个名为 magnum (http://micromagnum.informatik.uni-hamburg.de) 的模块处理所有可选的命令行参数。这里有一个例子来说明行为:
script1.py
#!/usr/bin/env python
import magnum
执行脚本会产生:
>>> ./script1.py -h
[WARNING] - Python Imaging Library not found!
[WARNING] - -> This means that the ImageShapeCreator and related classes are not available!
[ INFO] - Imported FFTW wisdom from file
Usage: scipt1.py [options]
Options:
--version show program's version number and exit
-h, --help show this help message and exit
Hardware options:
Options that control which hardware is used.
-g GPU_ID enable GPU processing (using 32-bit accuracy) on cuda
device GPU_ID. The simulator will fall back to CPU
mode if it was not compiled with CUDA support or when
no CUDA capable graphics cards were detected.
-G GPU_ID enable GPU processing (using 64-bit accuracy) on cuda
device GPU_ID. TODO: Describe fallback behaviour.
-t NUM_THREADS, --threads=NUM_THREADS
enable CPU multithreading with NUM_THREADS (1..64)
threads. This parameter instructs the fftw library to
use NUM_THREADS threads for computing FFTs.
Logging options:
Options related to logging and benchmarking.
-l LEVEL, --loglevel=LEVEL
set log level (0:Debug, 1:Info, 2:Warn, 4:Error,
5:Critical), default is Debug (0).
--prof Log profiling info at program exit.
Parameter sweep options:
These options have only an effect when the simulation script uses a
Controller object to sweep through a parameter range.
-p RANGE, --param-range=RANGE
select parameter set to run, e.g. --param-range=0,64
to run sets 0 to 63.
--print-num-params print number of sweep parameters to stdout and exit.
--print-all-params print all sweep parameters to stdout and exit.
Miscellanous options:
--on_io_error=MODE Specifies what to do when an i/o error occurs when
writing an .omf/.vtk file. 0: Abort (default), 1:
Retry a few times, then abort, 2: Retry a few times,
then pause and ask for user intervention
现在我想写一个小脚本,它有自己的命令行参数,然后使用 magnum 模块执行一些小计算。我想使用 argparse 来解析参数。但是argparse似乎比这个外部模块的参数处理优先级低,我自己的参数无法识别:
script2.py
#!/usr/bin/env python
import argparse
import magnum
parser = argparse.ArgumentParser(
description='TEST')
parser.add_argument('--x',
help='test_arg')
args = parser.parse_args()
print args.x
调用它:
>>>./scrip2.py --x 3
[WARNING] - Python Imaging Library not found!
[WARNING] - -> This means that the ImageShapeCreator and related classes are not available!
[ INFO] - Imported FFTW wisdom from file
Usage: test.py [options]
test.py: error: no such option: --x
我在 magnum 之前或之后导入 argparse 都没有关系。如果我不导入 magnum,argparse 会起作用:
script3.py
#!/usr/bin/env python
import argparse
parser = argparse.ArgumentParser(
description='TEST')
parser.add_argument('--x',
help='test_arg')
args = parser.parse_args()
print args.x
执行它会产生:
>>>./scrip2.py --x 3
3
我的问题是:如何在不编辑 magnum 的情况下阻止 magnum 处理我的命令行参数?
虽然我认为没有任何 'good' 解决方案,但您可以通过 monkeypatch argparse 使其成为 nop:
class EmptyParser():
def parse_args():
return
... (more redirects for add_argument)
argparse.ArgumentParser = EmptyParser
import magnum
或者,您可以将导入 magnum 包装在一个函数中,并通过该函数创建一个接口,并在 magnum 解析它们之前创建参数。
def magnum(param1, param2):
sys.argv = [param1, '--x', param2]
import magnum
不过,这两种方法都超级 hacky。
为了将来参考,这里是基于以上评论/答案的工作解决方案:
script3.py
#!/usr/bin/env python
import argparse
import sys
parser = argparse.ArgumentParser(
description='TEST')
parser.add_argument('--x',
help='test_arg')
args = parser.parse_args()
sys.argv = [sys.argv[0]]
import magnum
print args.x
执行脚本表明 magnum 已正确导入,而且参数已被解析并存储在 args 变量中:
>>>./script3.py --x 3
[WARNING] - Python Imaging Library not found!
[WARNING] - -> This means that the ImageShapeCreator and related classes are not available!
[ INFO] - Imported FFTW wisdom from file
[ INFO] - ----------------------------------------------------------------------
[ INFO] - MicroMagnum 0.2rc3
[ INFO] - Copyright (C) 2012 by the MicroMagnum team.
[ INFO] - This program comes with ABSOLUTELY NO WARRANTY.
[ INFO] - This is free software, and you are welcome to redistribute it under
[ INFO] - certain conditions; see the file COPYING in the distribution package.
[ INFO] - ----------------------------------------------------------------------
[ INFO] - FFTW using 1 threads from now on
[ INFO] - CUDA GPU support: no
3
此解决方案不会将任何参数转发给 magnum,这正是我想要实现的。
查看 github 来源,https://github.com/MicroMagnum
import magnum
导入一个包(magnum/__init__.py
)。而 init
中的关键动作是
config.cfg.initialize(sys.argv)
定义并创建 cfg = MagnumConfig()
。那检查环境。它还定义并运行 optparse
解析器。
所以没有明显的方法可以绕过它的解析器并仍然设置计算环境。在 import magnum
之前进行自己的解析和调整 sys.argv
似乎是唯一的解决方案。
我正在使用外部 python 模块,该模块不是我编写的,因此无法更改。这个名为 magnum (http://micromagnum.informatik.uni-hamburg.de) 的模块处理所有可选的命令行参数。这里有一个例子来说明行为:
script1.py
#!/usr/bin/env python
import magnum
执行脚本会产生:
>>> ./script1.py -h
[WARNING] - Python Imaging Library not found!
[WARNING] - -> This means that the ImageShapeCreator and related classes are not available!
[ INFO] - Imported FFTW wisdom from file
Usage: scipt1.py [options]
Options:
--version show program's version number and exit
-h, --help show this help message and exit
Hardware options:
Options that control which hardware is used.
-g GPU_ID enable GPU processing (using 32-bit accuracy) on cuda
device GPU_ID. The simulator will fall back to CPU
mode if it was not compiled with CUDA support or when
no CUDA capable graphics cards were detected.
-G GPU_ID enable GPU processing (using 64-bit accuracy) on cuda
device GPU_ID. TODO: Describe fallback behaviour.
-t NUM_THREADS, --threads=NUM_THREADS
enable CPU multithreading with NUM_THREADS (1..64)
threads. This parameter instructs the fftw library to
use NUM_THREADS threads for computing FFTs.
Logging options:
Options related to logging and benchmarking.
-l LEVEL, --loglevel=LEVEL
set log level (0:Debug, 1:Info, 2:Warn, 4:Error,
5:Critical), default is Debug (0).
--prof Log profiling info at program exit.
Parameter sweep options:
These options have only an effect when the simulation script uses a
Controller object to sweep through a parameter range.
-p RANGE, --param-range=RANGE
select parameter set to run, e.g. --param-range=0,64
to run sets 0 to 63.
--print-num-params print number of sweep parameters to stdout and exit.
--print-all-params print all sweep parameters to stdout and exit.
Miscellanous options:
--on_io_error=MODE Specifies what to do when an i/o error occurs when
writing an .omf/.vtk file. 0: Abort (default), 1:
Retry a few times, then abort, 2: Retry a few times,
then pause and ask for user intervention
现在我想写一个小脚本,它有自己的命令行参数,然后使用 magnum 模块执行一些小计算。我想使用 argparse 来解析参数。但是argparse似乎比这个外部模块的参数处理优先级低,我自己的参数无法识别:
script2.py
#!/usr/bin/env python
import argparse
import magnum
parser = argparse.ArgumentParser(
description='TEST')
parser.add_argument('--x',
help='test_arg')
args = parser.parse_args()
print args.x
调用它:
>>>./scrip2.py --x 3
[WARNING] - Python Imaging Library not found!
[WARNING] - -> This means that the ImageShapeCreator and related classes are not available!
[ INFO] - Imported FFTW wisdom from file
Usage: test.py [options]
test.py: error: no such option: --x
我在 magnum 之前或之后导入 argparse 都没有关系。如果我不导入 magnum,argparse 会起作用:
script3.py
#!/usr/bin/env python
import argparse
parser = argparse.ArgumentParser(
description='TEST')
parser.add_argument('--x',
help='test_arg')
args = parser.parse_args()
print args.x
执行它会产生:
>>>./scrip2.py --x 3
3
我的问题是:如何在不编辑 magnum 的情况下阻止 magnum 处理我的命令行参数?
虽然我认为没有任何 'good' 解决方案,但您可以通过 monkeypatch argparse 使其成为 nop:
class EmptyParser():
def parse_args():
return
... (more redirects for add_argument)
argparse.ArgumentParser = EmptyParser
import magnum
或者,您可以将导入 magnum 包装在一个函数中,并通过该函数创建一个接口,并在 magnum 解析它们之前创建参数。
def magnum(param1, param2):
sys.argv = [param1, '--x', param2]
import magnum
不过,这两种方法都超级 hacky。
为了将来参考,这里是基于以上评论/答案的工作解决方案:
script3.py
#!/usr/bin/env python
import argparse
import sys
parser = argparse.ArgumentParser(
description='TEST')
parser.add_argument('--x',
help='test_arg')
args = parser.parse_args()
sys.argv = [sys.argv[0]]
import magnum
print args.x
执行脚本表明 magnum 已正确导入,而且参数已被解析并存储在 args 变量中:
>>>./script3.py --x 3
[WARNING] - Python Imaging Library not found!
[WARNING] - -> This means that the ImageShapeCreator and related classes are not available!
[ INFO] - Imported FFTW wisdom from file
[ INFO] - ----------------------------------------------------------------------
[ INFO] - MicroMagnum 0.2rc3
[ INFO] - Copyright (C) 2012 by the MicroMagnum team.
[ INFO] - This program comes with ABSOLUTELY NO WARRANTY.
[ INFO] - This is free software, and you are welcome to redistribute it under
[ INFO] - certain conditions; see the file COPYING in the distribution package.
[ INFO] - ----------------------------------------------------------------------
[ INFO] - FFTW using 1 threads from now on
[ INFO] - CUDA GPU support: no
3
此解决方案不会将任何参数转发给 magnum,这正是我想要实现的。
查看 github 来源,https://github.com/MicroMagnum
import magnum
导入一个包(magnum/__init__.py
)。而 init
中的关键动作是
config.cfg.initialize(sys.argv)
定义并创建 cfg = MagnumConfig()
。那检查环境。它还定义并运行 optparse
解析器。
所以没有明显的方法可以绕过它的解析器并仍然设置计算环境。在 import magnum
之前进行自己的解析和调整 sys.argv
似乎是唯一的解决方案。