首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python URL中断系统命令

Python URL中断系统命令
EN

Stack Overflow用户
提问于 2018-07-17 02:57:24
回答 2查看 40关注 0票数 0

我正在尝试使用特定的启动参数打开chromium的授权URL。我无法使用webbrowser库找到此启动参数的解决方案,因此我转而使用os.system

代码语言:javascript
复制
browser_cmd = "chromium-browser --password-store=basic " + auth_url
os.system(browser_cmd)

直到URL中的"&“为止。因此,chromium打开时不会用keyring胡说八道来打扰我,而是只打开URL,直到第一个&。有没有办法处理URL并保持其完整性?

EN

回答 2

Stack Overflow用户

发布于 2018-07-17 02:59:55

这是因为&对于shell来说是特殊的。在Python 3中运行子进程的规范方法是:

代码语言:javascript
复制
import subprocess
subprocess.run(['chromium-browser', '--password-store=basic', auth_url],
               check=True)
print('chromium-browser exited successfully')
票数 1
EN

Stack Overflow用户

发布于 2018-07-17 03:05:24

这就是为什么您不应该将os.system用于任何非琐碎的事情。正如该函数的the docs所说的:

subprocess模块为生成新进程和检索其结果提供了更强大的工具;使用该模块比使用该函数更可取。请参阅subprocess文档中的Replacing Older Functions with the subprocess Module部分,了解一些有用的方法。

如果你点击这个链接,你会发现你可以这样写:

代码语言:javascript
复制
subprocess.call(['chromium-browser', '--password-store=basic', auth_url])

因为您传递的是一组参数,而不是试图将它们放在一个可以通过shell偷偷传递的字符串中,所以您不必担心引号或其他任何问题。

顺便说一下,您可能希望在这里使用run而不是call,但是由于某些原因,文档中的食谱在3.7版本中仍然没有更新,我不想通过显示与…不匹配的内容来增加混乱无论如何,您至少应该阅读文档顶部的快速入门“使用”部分。

如果出于某种原因,您确实想要使用os.system,则需要引用和/或转义auth_url参数。假设你不关心Windows,最好的方法是使用shlex模块:

代码语言:javascript
复制
browser_cmd = "chromium-browser --password-store=basic " + shlex.quote(auth_url)
os.system(browser_cmd)

如果你真的关心Windows,你可以在quote调用中添加posix=Falseshlex constructor中记录了posix标志的影响。默认的True值意味着它尽可能地遵循POSIX规则,这意味着它应该能够处理任何可能被处理的东西,只要你的shell与sh严格兼容(例如,bash是,但Windows cmd绝对不是,甚至tcshfish也可能不是)。对于False,它使用“兼容模式”。对于像您这样的简单示例,它应该可以毫不费力地适用于大多数shell,但如果您需要更复杂,则需要阅读Improved Compatibility with Shells。(而且,对于Windows cmdPowerShell,你可以推进的程度是有限制的。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51368481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档