Python与envoy,如何使用变量

3 投票
3 回答
1593 浏览
提问于 2025-04-17 10:54

我尝试使用Python的envoy库来更方便地访问Shell程序。但是我遇到了一个问题,我想删除一个文件夹里的所有项目,但envoy无法处理我的变量:

import envoy
import os

# Check for a empty folder. 
if len(os.listdir(csv_save_path)) != 0:
    for item in os.listdir(csv_save_path):
        result = envoy.run('rm -v',item)
        print result.std_out
        print result.std_err

输出:

"rm: missing operand\nTry `rm --help' for more information.\n"

我不想使用subprocess。有没有人知道哪里出错了?

编辑:

感谢你的快速回复。现在我收到了这个错误信息:

    Exception in thread Thread-4:
Traceback (most recent call last):
  File "/usr/lib64/python2.7/threading.py", line 552, in __bootstrap_inner
    self.run()
  File "/usr/lib64/python2.7/threading.py", line 505, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib64/python2.7/site-packages/envoy/core.py", line 40, in target
    bufsize=0,
  File "/usr/lib64/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/usr/lib64/python2.7/subprocess.py", line 1228, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

*** AttributeError: 'NoneType' object has no attribute 'returncode'

但是我检查了文件的路径,无论加不加路径,都是失败的。

编辑:解决办法是使用%s来把项目放到正确的位置。

import envoy
import os

# Check for a empty folder. 
if len(os.listdir(csv_save_path)) != 0:
    for item in os.listdir(csv_save_path):
        result = envoy.run('rm -v %s' % item)
        print result.std_out
        print result.std_err

到目前为止

3 个回答

0

你还可以使用 shlex.split 这个工具,来帮助你生成一个列表,这个列表可以用来传给 envoy.run(),而不是自己手动去写这个列表。

比如说:

>>> from shlex import split
>>> split("rm -v -- filename")
['rm', '-v', '--', 'filename']

在你的情况下,代码会像这样:

from shlex import split
# ......
result = envoy.run(split('rm -v %s' % (item)))
4

envoy.run的第二个参数是一个超时时间。你需要设置这个时间:

# The check for the empty folder is superfluous
for item in os.listdir(csv_save_path):
    filepath = os.path.join(csv_save_path, item)
    result = envoy.run(['rm', '-v', '--', filepath])
    print (result.std_out)
    print (result.std_err)

顺便问一下,为什么你要用命令行的rm,而不是用Python的os.unlink呢?

1

试试这个

import envoy
import os

# Check for an empty folder. 
if len(os.listdir(csv_save_path)) != 0:
    for item in os.listdir(csv_save_path):
        result = envoy.run('rm -v %s' % item)
        print "Output: %s" % result.std_out
        print "Error: %s" % result.std_err

撰写回答