V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
wallenorepeat
V2EX  ›  Linux

有关 Python 获取命令行参数中单引号的问题

  •  
  •   wallenorepeat ·
    onezhjp · 2019-10-25 14:55:43 +08:00 · 4749 次点击
    这是一个创建于 1616 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假如有这样一个脚本 main.py

    import sys
    print sys.argv
    

    执行 $ python main.py '"device=1,2"' 的输出是:

    ['./main.py', '"device=1,2"']
    

    其中的单引号没有保留,但是想要的输出是:

    ['./main.py', '\'"device=1,2"\'']
    

    想问一下大家,有保留单引号的方法吗?

    先提前谢谢各位了!

    14 条回复    2019-10-25 16:50:58 +08:00
    geelaw
        1
    geelaw  
       2019-10-25 15:10:51 +08:00 via iPhone
    改变你调用的写法
    wallenorepeat
        2
    wallenorepeat  
    OP
       2019-10-25 15:14:39 +08:00
    @geelaw 说的很对,之前试了,在 bash 里可以这么写:`python main.py $'\'"device=1,2"\''`,但是这样好麻烦,所以想问一下有没有其他办法可以不用这么写
    CallMeReznov
        3
    CallMeReznov  
       2019-10-25 15:14:47 +08:00
    ''"'device=1,2'"''
    wallenorepeat
        4
    wallenorepeat  
    OP
       2019-10-25 15:20:21 +08:00
    @CallMeReznov 我刚试了一下,这样的话,里面的双引号就消失了,结果是:`['./docker', "'device=1,2'"]`
    Ginson
        5
    Ginson  
       2019-10-25 15:25:34 +08:00
    >>python test.py "'hello'"
    ['test.py', "'hello'"]
    CallMeReznov
        6
    CallMeReznov  
       2019-10-25 15:26:35 +08:00
    a=sys.argv
    python("'%s'" %a)

    想加多少就加多少
    Ginson
        7
    Ginson  
       2019-10-25 15:27:57 +08:00
    没看清,原来你是想要单双引号都保留啊,就是参数所见是什么保留什么咯
    wallenorepeat
        8
    wallenorepeat  
    OP
       2019-10-25 15:29:54 +08:00
    @Ginson 是的,就是这个意思,我没有表述清楚
    geelaw
        9
    geelaw  
       2019-10-25 16:16:39 +08:00
    @wallenorepeat #2 这是不可能的,因为 bash 启动 Python 的时候那部分信息就已经没有了。
    ClericPy
        10
    ClericPy  
       2019-10-25 16:22:20 +08:00
    @wallenorepeat 必须这样写, 不然 bash 就报错了, 只能靠 backslash 来转义, 如果你想找类似 `` 这种原始字符串符号的话, 据我所知没有

    点进来之前我以为你也遇到 shlex.split 时候遇到 curl 里 data-binary 参数带 \' 的那个坑了呢...直接报错 unclosed quote, 坑我一夜
    xiaket
        11
    xiaket  
       2019-10-25 16:31:08 +08:00
    这是一个 bash 的问题, 不是一个 python 的问题
    wallenorepeat
        12
    wallenorepeat  
    OP
       2019-10-25 16:43:45 +08:00
    @geelaw @ClericPy 也就是说,bash 把参数传递给 python 程序之前,会对参数进行一些处理,这样的话确实没什么办法了

    其实最初的目的是想对 docker 命令做一些封装,在运行 docker run 的时候,自动加入 --label owner=$USER 这个参数,但是 docker run 的有些参数(比如 --gpus '"device=1,2"')由于上面这个问题就没法工作了

    实现方法是:在 sys.argv 里多加一个字符串参数 '--label owner=$USER',然后再把 sys.argv 拼接成完整的命令传给 os.system 函数
    wallenorepeat
        13
    wallenorepeat  
    OP
       2019-10-25 16:45:16 +08:00
    @xiaket 是的,后来才意识到
    ClericPy
        14
    ClericPy  
       2019-10-25 16:50:58 +08:00
    @wallenorepeat 其实说白了, python xxx.py a b c 这种命令是在 shell 上执行的, 当然得按照对方要求了, 不然你非要单引号, 那就在程序里用 input, 不过看你是不想和程序交互, 这招不好使. 稍微了解一下 shell 吧, 单引号和双引号还有不同, 很多好用但是反直觉的操作
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1188 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 18:15 · PVG 02:15 · LAX 11:15 · JFK 14:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.