【问题标题】:How to pass App argument to os.system()如何将 App 参数传递给 os.system()
【发布时间】:2014-06-12 23:55:21
【问题描述】:

我能够使用非常简单的语法启动应用程序。示例

app="/Applications/MyApp/myAppExecutable"
file="/Users/userName/Pictures/myPicture.jpg"

cmd="open -a '%s' '%s'" % (app, file)

os.system(cmd)

结果cmd这里是:

open -a '/Applications/MyApp/myAppExecutable' '/Users/userName/Pictures/myPicture.jpg'

它运行得很好。

但是我正在运行的应用程序接受一个可选的启动参数-proj filepath,所以带有这个可选参数的完整的cmd 字符串应该如下所示:

open -a '/Applications/MyApp/myAppExecutable' -proj '/Users/userName/Pictures' '/Users/userName/Pictures/myPicture.jpg'

但是,如果我用这样的 cmdstring 输入 os.system(),我会得到:

open: invalid option -- p

如何传递可选的应用参数而不导致错误和崩溃?

【问题讨论】:

  • 该语法在命令行中有效吗?看起来更像是open 问题而不是 Python 问题。
  • 如果你在命令行运行它,它工作吗?
  • 这是open 问题,不是 Python 问题。尝试在应用程序路径及其参数之间传递--。如果一切都失败了,你也可以在没有open的情况下简单地启动它,你只需要执行/Applications/MyApp/myAppExecutable/Contents/MacOS/myAppExecutable

标签: python macos


【解决方案1】:

根据open 手册页,您必须在参数之前将--args 传递给程序:

 --args
     All remaining arguments are passed to the opened application in the
     argv parameter to main().  These arguments are not opened or inter-
     preted by the open tool.

顺便说一句,您可能想考虑使用subprocess。以下是subprocess 命令的样子:

subprocess.check_call(['open', '-a', app, file])

无需摆弄字符串插值。

【讨论】:

  • 在使用subprocess时,您仍然需要--args-proj
  • @nneonneo:我们将--args 标志放在哪里:在行首、中间还是行尾?你真的知道解决办法吗?我可以从文档中复制/粘贴——这并不难。如果您真的知道答案,请发布示例。
  • @Sputnix:你为什么不在不同的位置尝试一下并报告呢?我用谷歌搜索了手册页。
【解决方案2】:

很可能将应用程序的特定参数提交给 OS open 命令。 open的语法:

open -a /path/to/application/executable.file /filepath/to/the/file/to/open/with/app.ext

似乎可以将两条路径用双引号或单引号括起来,例如:

open -a '/path/to/application/executable.file' '/filepath/to/the/file/to/open/with/app.ext'

正如 Ned 提到的标志 --args 可用于指定任何应用程序的特定启动标志。 App 特定的标志放在open--args 标志之后,例如:

open -a /path/to/application/executable.file  --args -proj

问题是应用程序特定的标志(例如-proj)只会在应用程序启动时传递。如果它已经在运行,open -a 命令将只打开一个文件(如果指定了 file_to_be_opened)但不会传递应用程序的特定参数。换句话说,应用程序只能在启动时接收它的参数。 有-n 标志可用于open -a 命令。当使用open -a 时,将根据需要启动尽可能多的应用程序实例。每个 App 实例都会正确获取 App args。

open -a '/path/to/application/executable.file' '/filepath/to/the/file/to/open/with/app.ext -n --args -proj "SpecificToApp arg or command" '

如果与subprocess 一起使用,则全部翻译:

subprocess.check_call(['open', '-a', app, file, '-n', '--args', '-proj', 'proj_flag_values'])

或简单地将其作为字符串 arg 传递给:

os.system(cmdString)

【讨论】:

    猜你喜欢
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 2019-07-16
    • 2017-09-21
    • 2020-10-09
    相关资源
    最近更新 更多