如何在 Linux Ubuntu 12.04 上从 Python 调用脚本文件或可执行文件
Posted
技术标签:
【中文标题】如何在 Linux Ubuntu 12.04 上从 Python 调用脚本文件或可执行文件【英文标题】:how to call a script file or executable from Python on Linux Ubuntu 12.04 【发布时间】:2012-10-07 02:56:53 【问题描述】:如果我从 Python 解释器或 Python 脚本调用脚本文件,我会收到错误 'No such file or directory'
并且 Linux 脚本不会执行。
如果我调用纯 Linux 命令,例如 subprocess.call('ls') 就可以了。
在“C”中,我会使用:system("");
Python 中的等价物是什么?
从我的 Python 脚本,在 Linux 计算机上,我需要调用执行构建的脚本。
subprocess.call
非常适合 Linux shell 命令,但是当我调用脚本时会得到 'No such file or directory'
。
这是我调用的 Python 脚本行:
rtn_code = subprocess.call(['~/WindRiver/workspace/XPedite5570_SMP_VIP/build_MM_VxWorks'])
`build_MM_VxWorks` is a Linux script that uses VxWorks development tools to build a VxWorks kernel.
`build_MM_VxWorks` works okay from the Linux command line.
【问题讨论】:
您是否尝试过指定绝对路径而不是使用~/
表示法?
~ 是外壳的一个特性。如果你不调用 shell,你就没有它。
你可以通过读取os.environ['HOME']
或pwd.getpwuid(os.getuid()).pw_dir
的值来近似~的行为。
@FatalError 还有os.path.expanduser
这有效: import os os.system('./myscript') 也 os.system('~/primary/experiments/myscript') 但是, import subprocess subprocess.call('./myscript ') ...不起作用。为什么?
【参考方案1】:
您可能想试试pexpect。它在较高级别上模拟 shell 用户输入。它可能有点“hacky”,但是当您需要自动化工作程序时它非常强大。
这是我如何使用它来读取数据库中的表:
import pexpect, getpass
child = pexpect.spawn('mysql -u root -p')
child.expect('Enter password: ')
password = getpass.getpass("Enter Mysql password for user root \n")
child.sendline(password)
child.sendline("use database")
child.expect('Database changed')
child.sendline('SELECT * FROM table;')
child.interact()
如您所见,模仿用户输入非常容易。
【讨论】:
以上是关于如何在 Linux Ubuntu 12.04 上从 Python 调用脚本文件或可执行文件的主要内容,如果未能解决你的问题,请参考以下文章
Linux - Ubuntu中文输入法安装(Ubuntu 12.04)