这行代码让我陷入困境。我已经阅读了很多在新的终端窗口中启动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
答案 0 :(得分:1)
它告诉你实话。当您运行xterm <thing>
时,xterm
会尝试在<thing>
中找到名为$PATH
的二进制文件。在这种情况下,你传递了一个长引号字符串,但它仍然是一个参数,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")
答案 1 :(得分:0)
如上所述,您应该使用-e
option:
-e
程序[参数...]
此选项指定程序(及其命令行) 参数)在xterm窗口中运行。它也设定了 窗口标题和图标名称是程序的基本名称 如果命令上既没有-T也没有-n,则被执行 行。
注意:这必须是命令行上的最后一个选项。
手册页中有一个微妙的要点:当你省略 -e
时,xterm会尝试将整个带引号的字符串解释为shell解释器的名称。这是由于它实现localFilter:
使用区域设置过滤器时,例如,使用
-e
选项,或 shell,xterm首先尝试通过该过滤器传递控制权。如果 它失败了,xterm将在没有locale-filter的情况下重试。的xterm 在重试之前警告失败。
在OPTIONS部分的开头还有一些额外的讨论:
可以给出一个参数(在所有选项之后)。这超过了xterm的 内置的shell程序选择:
- 如果参数不是相对路径,即以&#34; ./"开头;要么 &#34; ../" ;, 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
这不是你想要的。
答案 2 :(得分:0)
subprocess.Popen(['xterm', '-e', 'bash -c \"python pythonFile.py; exec bash\"'])