对os.system的多行命令

时间:2018-04-25 23:50:24

标签: python-3.x tkinter pep8

我可能会在这里找到一些显而易见的东西,但搜索google / so并没有提供任何有用的信息。

我正在编写python脚本,使用 /*** Defined in the header file: std::vector<Term *> terms; For brevity, I've removed other function definitions....***/ void Document::compareToDoc(Document *myDoc) { for(auto const& term : myDoc->getTerms()) { //auto it = find(terms.begin(), terms.end(), term); auto it = find_if(terms.begin(), terms.end(), [](const Term *t1){return t1->getTerm() = term->getTerm();}); if(it != terms.end()) { std::cout << " .. found" << std::endl; } // end if } // end for } // compareToDoc tkinter来打开文件选择器。在没有深入细节的情况下,我有以下一行,用于将文件选择器带到屏幕的前面(直接从this helpful answer获取):

filedialog.askopenfilename

从上面的代码片段中可以看出,对于pep8指南而言,这一行太长了,我想将其分解。

然而,尽管我付出了最大的努力,但我似乎无法分开。这是因为(我认为)该行包含单引号和双引号,不幸的是os.system似乎坚持认为它是单行。

我已经尝试了

  1. 三重引号
  2. 字符串文字修补(os.system('''/usr/bin/osascript -e 'tell app "Finder" to set frontmost of process "Python" to true' ''') 在最后,\在每行的开头)
  3. 每行的三重引号
  4. 如果相关:使用OSX并运行python 3.6.4。

    打破这条线路的正确(理想情况下,最小化)方法是什么?

1 个答案:

答案 0 :(得分:3)

使用经过改进的subprocess模块通常是一种更好,更强大,更安全的方式来调用外部可执行文件。

您当然可以将带有\n的变量作为参数传递。

注意,double (())是因为第一个参数是一个元组。

import subprocess
subprocess.call((
    '/usr/bin/osascript', 
    '-e',  
    'tell app "Finder" to set frontmost of process "Python" to true',
    ))

有时候有理由通过shell调用,但通常不会。

https://docs.python.org/3.6/library/subprocess.html