2017-04-09 239 views
0

这行代码有我的阻碍。我已经阅读了许多在新的终端窗口中启动python脚本的方法。我认为我对这个陈述非常接近,但似乎在我的道路上窒息。在另一个xterm会话中启动python脚本

的代码行是:

os.system("xterm -hold 'sudo python /home/pi/newcode/newcode/hms2-v2.5.py'") 

的错误信息是:

xterm: no absolute path found for shell: sudo python /home/pi/newcode/newcode/hms2-v2.5.py 

回答

1

它告诉你真相。当您运行xterm <thing>时,xterm将尝试在您的$PATH中找到一个名为<thing>的二进制文件。在这种情况下,您已经传递了一个长引号的字符串,但它仍然是一个参数,并且xterm可以预料地找不到它。

对于您要做的事情,您需要-e选项。从手册页:

-e program [ arguments ... ] 
      This option specifies the program (and its command line arguments) to be run in the xterm window. It also sets 
      the window title and icon name to be the basename of the program being executed if neither -T nor -n are given on 
      the command line. 

所以:

os.system("xterm -hold -e sudo python /home/pi/newcode/newcode/hms2-v2.5.py") 
+0

我挣扎了几个小时。我有一个'-e'选项,但是在选择之前。它启动的程序有错误,因为它现在使用的文件有不同的路径。我猜我需要编辑我的代码以包含我使用的文件的完全绝对路径? – user3808752

0

如前所述,你应该使用-e option

-e程序[参数...]
该选项指定程序(及其命令行 参数)在xterm窗口中运行。它还将 窗口标题和图标名称设置为正在执行的程序 的基本名称,前提是命令 行上既未指定-T也未指定-n。
注意:这必须是上一个选项在命令行上。

有在手册中一个微妙的一点:当你省略-e,xterm中试图解释整个引号的字符串作为一个shell解释器的名字。这是间接地由于它的方式实现了localFilter

当使用区域设置的过滤器,例如,与-e选项,或者通过该过滤器的 壳,xterm中首先尝试传递控制。如果 失败,则xterm将在没有区域设置过滤器的情况下重试。 Xterm 在重试之前会对失败发出警告。

有在OPTIONS部分的开头一些额外的讨论:可给予

一个参数(所有选项后)。它覆盖外壳程序的xterm的 内置的选择:

  • 如果参数是不是相对路径,即以”开头。/“或 ” ../”的xterm会在用户的路径中的文件。在这两种情况下,如果xterm中无法构建绝对路径 检查失败。

所以...当你试图

os.system("xterm -hold 'sudo python /home/pi/newcode/newcode/hms2-v2.5.py'") 

的xterm试图找到一个名为

sudo python /home/pi/newcode/newcode/hms2-v2.5.py 

这是不是你打算什么程序。

相关问题