【问题标题】:How do I access python command line options (not args)如何访问 python 命令行选项(不是 args)
【发布时间】:2017-09-25 23:44:00
【问题描述】:

调用 python 程序的命令行如下所示:

$ python [python_options] myprogram.py [args]

我知道我可以访问 args (sys.argv),但是如何访问 python_options?

我不经常使用 python_options,但有时它很有用,例如-u(无缓冲输出)或 -3(检查 python3 不兼容性)。

确切地说,我想创建一个子进程,它是另一个 python 程序,我想将相同的 python_options 传递给它。 (我知道 sys.flags,但这不是我想要的。我不想要标志的值;我想要设置这些标志的命令行中使用的实际字符串)。

【问题讨论】:

  • 也许挖掘multiprocessing 的代码会有所帮助?我假设它将标志传递给它的工作进程。
  • 我开始认为这不能直接完成,而是我需要这样做:$ python [python_options] myprogram.py [python_options2] [args],并将python_options2 传递给我的子进程。显然我需要确保 myprogram.py 不会混淆 args 和 python 选项,但我认为我可以做到。
  • 如果您编写另一个脚本接受python_options 作为参数并将myprogram.py 视为特殊子进程可能会更好。在那种情况下,永远不需要python_options2。希望对你有帮助:)
  • 您可以使用 ctypes 获取原始命令行参数并将所有内容保持在[-c cmd | -m mod | file | -]
  • @eryksun 我该怎么做? (我查看了 ctypes 页面,但看不到任何帮助)。

标签: python command line


【解决方案1】:

一种可能的解决方案是手动生成标志字符串。

import sys

def getFlags():
    flags = ['-d', '-3', '-Q', '-Qnew', '-i', '-i', '-O',
             '-B', '-s', '-S', '-E', '-t', '-v', '-U', '-b', '-R']
    return ' '.join({s for s, f in zip(flags, sys.flags) if f})

print getFlags()

Python Docs for sys.flags

编辑:如果您的 python 版本低于2.7.3,则应在此处删除标志-R

【讨论】:

  • 奇怪的是,-u 的状态在 sys.flags 中不可用。
  • @PeterB 我刚刚发现-u 用于disable output buffering-U 如果用于Unicode
【解决方案2】:

以一种简单的方式,首先使用 cli-args-system 安装

windows: pip install cli-args-system 
linux:  pip3 install cli-args-system 

之后

from cli_args_system import Args
args = Args()
flags = args.flags()
print(flags)

【讨论】:

  • 从 cli-args-system 的文档来看,它似乎只适用于 sys.argv,而不是访问传递给 Python 解释器的选项本身。问题问的是后者。
  • 不,它有很多功能,但是,尝试运行这段代码,你会看到它捕获了所有的标志,dock 在这里:pypi.org/project/cli-args-system(我做了这个库)跨度>
  • 我看到了该文档,并且没有一个示例在python3 之后直接 有任何选项,例如python3 -E test.py -a 1 -b 2 中的-E 选项。这些选项都适用于test.py 脚本。
  • 我不明白这些是什么,我可能会将其与标志混淆,在这种情况下,lib 不涵盖这些
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 2017-06-14
  • 2019-02-25
相关资源
最近更新 更多