Форум сайта python.su
Здравствуйте. Хочу переместить содержимое папки в другую. Для этого использую вызов subprocess.Popen(“mv”…):
st_out = subprocess.Popen(["mv", "-f", r"/dir/_{0}/*".format(id), r"/dir/{0}".format(id)], bufsize=-1, close_fds=True, shell=False, universal_newlines=True, stdout=subprocess.PIPE).communicate()
mv: не удалось выполнить stat для «/dir/_222/*»: Нет такого файла или каталога
mv -f /dir/_222/* /dir/222
Отредактировано (Апрель 15, 2011 11:29:36)
Офлайн
А что вам мешает использовать shutil?
Офлайн
Наиболее близкий аналог mv -f /dir/_222/* /dir/222
os.system("mv -f /dir/_{0}/* /dir/{0}".format(id))
os.system("ls")
Отредактировано (Апрель 15, 2011 12:21:44)
Офлайн
Vader
Если сделать, используя copy tree:
shutil.copytree(r"/dir/_{0}/*".format(id), r"/dir/{0}".format(id), symlinks=True)
Traceback (most recent call last):
***
File "/usr/lib64/python2.7/shutil.py", line 168, in copytree
names = os.listdir(src)
OSError: [Errno 2] No such file or directory: '/dir/_222/*'
shutil.copytree(r"/dir/_{0}".format(id), r"/dir/{0}".format(id), symlinks=True)
Traceback (most recent call last):
***
File "/usr/lib64/python2.7/shutil.py", line 174, in copytree
os.makedirs(dst)
File "/usr/lib64/python2.7/os.py", line 157, in makedirs
mkdir(name, mode)
OSError: [Errno 17] File exists: '/dir/222'
shutil.move(r"/dir/_{0}/*".format(id), r"/dir/{0}".format(id))
Traceback (most recent call last):
***
File "/usr/lib64/python2.7/shutil.py", line 292, in move
copy2(src, real_dst)
File "/usr/lib64/python2.7/shutil.py", line 127, in copy2
copyfile(src, dst)
File "/usr/lib64/python2.7/shutil.py", line 81, in copyfile
with open(src, 'rb') as fsrc:
IOError: [Errno 2] No such file or directory: '/dir/_222/*'
shutil.move(r"/dir/_{0}".format(id), r"/dir/{0}".format(id))
The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; using that module is preferable to using this function.Поэтому его не использовал сначала. Сейчас попробовал, все получилось:
Документация
os.system("mv -f /dir/_{0}/* /dir/{0}".format(id))
os.system("pwd")
Отредактировано (Апрель 15, 2011 13:16:49)
Офлайн
Shutil правильно ругается, ему * в пути не нужен.
Если директорию, в которую производится копирование, удалять нельзя, то можно сделать так:
import os, shutil
src = r'/dir/_222/'
dst = r'/dir/222/'
for node in os.listdir(src):
if os.path.isfile(os.path.join(src,node)):
shutil.copy(os.path.join(src,node), dst)
else:
shutil.copytree(os.path.join(src,node), os.path.join(dst,node), symlinks=True)
Офлайн
os.system выполняет команду через шел, а шел разворачивает символ “*” в список файлов перед тем, как передать утилите аргументы коммандрой строки.
subprocess.Popen выдает ошибку “mv: не удалось выполнить stat для «/dir/_222/*»: Нет такого файла или каталога”, т.к. он интерпретирует “/dir/_222/*” как файл - mv запускается не через шел - это даже указано явно в параметре “shell=False”. Тот же эффект будет, если заэкранировать символ “*” - “mv -f /dir/_222/\* /dir/222”.
Теперь, чтобы все заработало, нужно просто указать shell=True. Там же в документации указано, что если shell=True, то команда должна быть одной строкой, а все остальные параметры пойдут, как параметры для шела, а не параметры утилиты.
>>> stdout = subprocess.Popen("mv -f /dir/_222/* /dir/222/", shell=True)
>>> os.listdir("/dir/_222")
[]
>>> os.listdir("/dir/222")
['asdf', 'asdfasdfasdf', '32q4wdf']
Отредактировано (Апрель 15, 2011 14:20:34)
Офлайн
ZAN
Спасибо за подробные разъяснения. Теперь все работает и через subprocess.Popen
Отредактировано (Апрель 15, 2011 14:56:37)
Офлайн