【问题标题】:Am I using os.system correctly? My application won't open anymore我正确使用 os.system 吗?我的应用程序将不再打开
【发布时间】:2021-01-06 16:38:53
【问题描述】:

几天前,我的程序中有os.system(r"C:\Users\red\Desktop\Test UI") 这一行。我对其进行了测试,它运行良好,它按照我想要的方式打开了应用程序。

现在,大约五天后我又回来了,突然间它不能正常工作了。我检查了流程,上面写着'C:\Users\red\Desktop\Test' is not recognized as an internal or external command, operable program, or batch file.

我已经查看了有关 os.system 的其他问题,例如 How do I execute a program from Python? os.system fails due to spaces in path,但我已经在使用原始字符串,例如建议的答案之一。我不明白它是如何一天工作的,而下一天它却无法正常工作。

【问题讨论】:

  • 在任何情况下,您都应该将os.system 替换为subprocess.run,但我看不出如果它以前工作过,它怎么会停止工作。错误消息表明,无论 os.system 在幕后使用什么 shell,都已停止将其视为单个路径,并开始将其视为路径加参数,在 TestUI 之间的空格上拆分。
  • 这很奇怪。它似乎与名称中的空格混淆了。您可以尝试os.system(r'"C:\Users\red\Desktop\Test UI"') - 我只是将字符串用单引号括起来,这样双引号实际上会转到 Windows 进程执行。
  • ...嗯,我假设要运行的文件是“Test UI.exe”
  • 请注意,在链接问题的答案中,使用的是subprocess.call,而不是os.system。当您不在前者上使用shell=True 时,这些是非常不同的事情。 subprocess.call 不会尝试使用默认的 shell=False 进行任何类型的字符串拆分,而 os.system 期望所有内容都以本地 shell 的语法传递(这需要引用或转义空格,尽管详细说明如何是特定于平台的)。
  • @tdelaney 实际上只是测试用户界面,它是打开谷歌浏览器标签并将我带到某个页面的快捷方式。我尝试使用您推荐的单引号,然后使用您推荐的双引号方法,但我仍然得到与问题中提到的相同的错误。

标签: python os.system


【解决方案1】:

在 Windows 上出现一系列路径问题后,我们最近将 os.system 替换为 subprocess.run。

对于这个例子,你可以替换

os.system(r"C:\Users\red\Desktop\Test UI")

subprocess.run(r'"C:\Users\red\Desktop\Test UI"',shell=True)

对于 Windows 快捷方式,我必须在调用中添加 .lnk 扩展名:

subprocess.run(r'"C:\Users\red\Desktop\Test UI.lnk"',shell=True)

【讨论】:

  • 我尝试了这个建议,得到了错误“FileNotFoundError: [WinError 2] The system cannot find the file specified.”
  • 上面的代码是在 python 3.7.2 上测试的。我的工作代码在subprocess.run(r'"c:\users\myname\Desktop\AD Explorer.exe"') 下面也可以在没有 .exe 和 , shell=True 的情况下工作
  • 要使用 Windows 快捷方式,我必须在末尾添加 .lnk subprocess.run(r'"c:\users\myname\Desktop\Postman.lnk"',shell=True)
【解决方案2】:

我想通了。由于某种原因, os.system 停止工作,并且 subprocess.run 或 subprocess.call 没有工作。我将我的命令切换为使用 os.startfile 并开始正常工作。

这是最终结果:

os.startfile(r"C:\Users\red\Desktop\Test UI")

【讨论】:

    【解决方案3】:

    实际上,您正在使用正确的命令来执行文件,但是您要执行的文件不在该目录中。文件不在目录路径时会出现错误'C:\users...' is not not recognized as an internal or external command, operable program, or batch file

    不需要在文件名后写.exe,但你必须写下该目录中存在的正确文件名。

    【讨论】:

    • 我要执行的文件确实在那个目录下。文件名是正确的,它应该执行一个快捷方式,打开一个谷歌浏览器标签,把我带到一个特定的页面。
    • 请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange 网络上发布,您已授予不可撤销的权利,在 CC BY-SA license (2.5/3.0/4.0) 下,Stack Exchange 可以分发该内容(即无论您未来的选择如何)。根据 Stack Exchange 政策,帖子的非破坏版本是分发的版本。因此,任何破坏行为都将被撤销。如果您想了解更多关于删除帖子的信息,请参阅:How does deleting work?
    猜你喜欢
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 2021-08-20
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    相关资源
    最近更新 更多