有关 Python 获取命令行参数中单引号的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
wallenorepeat
V2EX    Linux

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

  •  
  •   wallenorepeat
    onezhjp 2019 年 10 月 25 日 5363 次点击
    这是一个创建于 2374 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假如有这样一个脚本 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 日 via iPhone
    改变你调用的写法
    wallenorepeat
        2
    wallenorepeat  
    OP
       2019 年 10 月 25 日
    @geelaw 说的很对,之前试了,在 bash 里可以这么写:`python main.py $'\'"device=1,2"\''`,但是这样好麻烦,所以想问一下有没有其他办法可以不用这么写
    CallMeReznov
        3
    CallMeReznov  
       2019 年 10 月 25 日
    ''"'device=1,2'"''
    wallenorepeat
        4
    wallenorepeat  
    OP
       2019 年 10 月 25 日
    @CallMeReznov 我刚试了一下,这样的话,里面的双引号就消失了,结果是:`['./docker', "'device=1,2'"]`
    Ginson
        5
    Ginson  
       2019 年 10 月 25 日
    >>python test.py "'hello'"
    ['test.py', "'hello'"]
    CallMeReznov
        6
    CallMeReznov  
       2019 年 10 月 25 日
    a=sys.argv
    python("'%s'" %a)

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

    点进来之前我以为你也遇到 shlex.split 时候遇到 curl 里 data-binary 参数带 \' 的那个坑了呢...直接报错 unclosed quote, 坑我一夜
    xiaket
        11
    xiaket  
       2019 年 10 月 25 日
    这是一个 bash 的问题, 不是一个 python 的问题
    wallenorepeat
        12
    wallenorepeat  
    OP
       2019 年 10 月 25 日
    @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 日
    @xiaket 是的,后来才意识到
    ClericPy
        14
    ClericPy  
       2019 年 10 月 25 日
    @wallenorepeat 其实说白了, python xxx.py a b c 这种命令是在 shell 上执行的, 当然得按照对方要求了, 不然你非要单引号, 那就在程序里用 input, 不过看你是不想和程序交互, 这招不好使. 稍微了解一下 shell 吧, 单引号和双引号还有不同, 很多好用但是反直觉的操作
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2632 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 54ms UTC 02:05 PVG 10:05 LAX 19:05 JFK 22:05
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86