无法使用子进程Popen为应用程序启动Instruments'Time Profiler'

问题描述 投票:0回答:1

我需要以异步方式通过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))
python subprocess popen instruments
1个回答
0
投票

通常,使用子流程库是正确的方法。

如果要为echo <something> | sudo -S <something>之类的东西启动子进程,则需要通过外壳执行该子进程,因为有多个与管道链接的命令。您可以通过将shell=True传递给Popen调用来实现。不需要shlex

[Aside:子进程还允许您直接将输入传递给程序,因此您无需使用echo和shell,请参见the documentation作为stdin参数和communicate()调用。

© www.soinside.com 2019 - 2024. All rights reserved.