我尝试使用Python envoy来更好地访问Shell程序。但我有一个问题,我想删除一个文件夹的所有项目,但特使无法处理我的变种:
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"
我不想使用子过程。谁知道出了什么问题?
编辑:
感谢您的快速回复。现在我收到此错误消息:
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
到目前为止
答案 0 :(得分: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 :(得分: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
答案 2 :(得分:0)
您还可以使用shlex.split帮助您形成列表以提供给envoy.run(),而不是手工制作/编码列表。
E.g。
>>> from shlex import split
>>> split("rm -v -- filename")
['rm', '-v', '--', 'filename']
在您的情况下,代码如下所示:
from shlex import split
# ......
result = envoy.run(split('rm -v %s' % (item)))