我需要以异步方式通过python以编程方式为应用程序引入跟踪日志记录,即不等待它,而是作为一个单独的进程打开。我可以使用以下命令通过终端窗口启动Instruments:
$ instruments -t Time\ Profiler "/Applications/.../<app_name>.app" <arguments>
e.g. $ instruments -t Time\ Profiler "/Applications/MyApp.app" "/Users/<username>/Desktop/TestFiles/file.txt"
传递给os.system的命令运行良好,但是问题在于它等待应用程序退出:
os.system("echo %s | sudo -S %s" % (password,trace_launch_cmd))
但是当我使用Subprocess.Popen()时出现错误:
应用启动失败,并显示错误:[Errno 2]没有这样的文件或目录:'instruments -t Time \ Profiler“ /Applications/MyApp.app”'
我还尝试过使用shlex.split()拆分命令,然后在subprocess.Popen中使用它,但是它什么也不做。
app_launch_path = r'/Applications/MyApp.app'
trace_cmd = r'instruments -t Time\ Profiler '
app_launch_with_testfile = '"' + app_launch_path + '" ' + '"' + testfile_full_path + '"'
trace_launch_cmd = trace_cmd + app_launch_with_testfile
os.system("echo %s | sudo -S %s" % (password,trace_launch_cmd))
通常,使用子流程库是正确的方法。
如果要为echo <something> | sudo -S <something>
之类的东西启动子进程,则需要通过外壳执行该子进程,因为有多个与管道链接的命令。您可以通过将shell=True
传递给Popen
调用来实现。不需要shlex
。
[Aside:子进程还允许您直接将输入传递给程序,因此您无需使用echo
和shell,请参见the documentation作为stdin
参数和communicate()
调用。