如何将App参数传递给os.system()

时间:2014-06-12 23:55:21

标签: python macos

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

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

如何传递可选的app参数而不会导致错误并崩溃?

2 个答案:

答案 0 :(得分: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])

不需要摆弄字符串插值。

答案 1 :(得分:1)

很有可能将应用程序的特定参数提交给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可用于指定任何应用程序的特定启动标志。 应用程序特定标志位于open的{​​{1}}标志之后,例如:

--args

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

open -a

如果与open -a '/path/to/application/executable.file' '/filepath/to/the/file/to/open/with/app.ext -n --args -proj "SpecificToApp arg or command" ' 一起使用,则全部翻译:

subprocess

或者只是将其作为字符串arg传递给:

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