在我的本地机器上,我运行一个包含这一行的python脚本

bashCommand = "cwm --rdf test.rdf --ntriples > test.nt"
os.system(bashCommand)

这很好。

然后在服务器上运行相同的代码,得到以下错误消息

'import site' failed; use -v for traceback
Traceback (most recent call last):
File "/usr/bin/cwm", line 48, in <module>
from swap import  diag
ImportError: No module named swap

因此,我所做的是,我插入了一个打印bashCommand,它在终端中使用os.system()运行命令之前,将我打印出来。

当然,我再次得到错误(由os.system(bashCommand)引起),但在该错误之前,它在终端中打印命令。然后我复制输出并复制粘贴到终端,然后按enter,它工作了…

有人知道这是怎么回事吗?


当前回答

你可以使用子进程,但我总觉得这不是一种“python”的方式。所以我创建了Sultan(无耻的插头),它可以很容易地运行命令行函数。

https://github.com/aeroxis/sultan

其他回答

python的方法是使用subprocess。Popen

子流程。Popen接受一个列表,其中第一个元素是要运行的命令,后面跟着任何命令行参数。

举个例子:

import subprocess

args = ['echo', 'Hello!']
subprocess.Popen(args) // same as running `echo Hello!` on cmd line

args2 = ['echo', '-v', '"Hello Again"']
subprocess.Popen(args2) // same as running 'echo -v "Hello Again!"` on cmd line

你可以使用子进程,但我总觉得这不是一种“python”的方式。所以我创建了Sultan(无耻的插头),它可以很容易地运行命令行函数。

https://github.com/aeroxis/sultan

你也可以使用'os.popen'。 例子:

import os

command = os.popen('ls -al')
print(command.read())
print(command.close())

输出:

total 16
drwxr-xr-x 2 root root 4096 ago 13 21:53 .
drwxr-xr-x 4 root root 4096 ago 13 01:50 ..
-rw-r--r-- 1 root root 1278 ago 13 21:12 bot.py
-rw-r--r-- 1 root root   77 ago 13 21:53 test.py

None

subprocess.Popen()优于os.system(),因为它提供了更多的控制和可见性。但是,如果你觉得subprocess.Popen()太啰嗦或复杂,可以使用我在上面写的一个小包装器——peasyshell,它可以很容易地与Python中的bash交互。

https://github.com/davidohana/peasyshell

你可以使用bash程序,带参数-c来执行命令:

bashCommand = "cwm --rdf test.rdf --ntriples > test.nt"
output = subprocess.check_output(['bash','-c', bashCommand])