#python #linux
#python #linux
Вопрос:
У меня есть этот скрипт на Python
#!/usr/bin/env python
import datetime, os
from time import gmtime, strftime
to_backup = "/home/vmware/tobackup"
var1 = datetime.datetime.now().strftime('%b-%d-%I%p')
for f in os.listdir(to_backup):
if(os.path.isfile(f)):
print f " is a file"
if(os.path.isdir(f)):
print f " is a directory"
Это дает мне пустой вывод. я не знаю, в чем проблема
ВЫВОД ДЛЯ ответа доктора джимбоба
total 36
-rwxrwxr-x 1 vmware vmware 440 May 5 07:41 back.py
-rwxrwxr-x 1 vmware vmware 2624 May 4 20:35 backup.sh
drwxr-xr-x 2 vmware vmware 4096 Jun 22 2010 Desktop
drwxrwxr-x 2 vmware vmware 4096 May 5 03:51 destination
drwxr-xr-x 2 root root 4096 May 4 18:49 public_html
drwxrwxr-x 2 vmware vmware 4096 May 1 07:47 python
-rwxrwxr-x 1 vmware vmware 560 May 1 13:20 regex.py
drwxrwxrwx 7 vmware vmware 4096 May 5 03:50 tobackup
total 20
drwxrwxrwx 2 vmware vmware 4096 May 5 03:50 five
drwxrwxrwx 2 vmware vmware 4096 May 5 03:50 four
drwxrwxrwx 2 vmware vmware 4096 May 5 03:50 one
drwxrwxrwx 2 vmware vmware 4096 May 5 03:50 three
drwxrwxrwx 2 vmware vmware 4096 May 5 03:50 two
Комментарии:
1. Что это
os.listdir(to_backup)
вам дает? Можете ли вы вручную проверить через оболочку, что в этом каталоге есть файлы?2. файлы есть, и я попробовал команду listdir, и она снова показывает пустую
3. Вызовите свой скрипт (допустим, он вызывается lister.py ) с помощью python -v lister.py и опубликуйте вывод, пожалуйста.
Ответ №1:
Хорошо, у вас есть разрешение, но вы находитесь не в том каталоге, когда перечисляете файлы. list_dir выдает вам список каталогов / файлов без указания пути к ним, и os.path.isfile('one')
и os.path.isdir('one')
проверит, существует ли каталог ‘one’ в текущем каталоге (где бы вы ни запустили скрипт, если вы явно не изменили каталог на os.chdir
или не включили путь, например, os.path.isdir('/home/vmware/tobackup/one')
.
#!/usr/bin/env python
import datetime, os
from time import gmtime, strftime
import subprocess
to_backup = "/home/vmware/tobackup"
var1 = datetime.datetime.now().strftime('%b-%d-%I%p')
os.chdir(to_backup)
# os.listdir(to_backup) = ['one', 'two', 'three', 'four', 'five']
for f in os.listdir(to_backup):
if(os.path.isfile(f)):
print f " is a file"
if(os.path.isdir(f)):
print f " is a directory"
или
to_backup = "/home/vmware/tobackup"
var1 = datetime.datetime.now().strftime('%b-%d-%I%p')
# os.listdir(to_backup) = ['one', 'two', 'three', 'four', 'five']
for f in os.listdir(to_backup):
if(os.path.isfile(os.path.join(to_backup,f))):
print f " is a file"
if(os.path.isdir(os.path.join(to_backup,f))):
print f " is a directory"
или с walk
(но на самом деле не проходит через вложенные папки).
to_backup = "/home/vmware/tobackup"
var1 = datetime.datetime.now().strftime('%b-%d-%I%p')
root, dirs, files in os.walk(to_backup).next()
for file in files:
print f " is a file in " root
for dir in dirs:
print f " is a directory"
РЕДАКТИРОВАТЬ: Чтобы было еще понятнее, ошибка с вашим оригинальным скриптом заключается в том, что у вас файловая структура типа:
/home/user/bin/your_script.py
/home/vmware/tobackup/
/home/vmware/tobackup/one
/home/vmware/tobackup/two
...
Когда вы заходите в /home/user /bin для запуска вашего скрипта (например, python your_script.py
), os.listdir('/home/vmware/tobackup')
вам выдается список имен файлов и каталогов в /home / vmware / tobackup, то есть ['one','two', ...]
. Однако, когда вы делаете это os.path.isfile('one')
из каталога /home/user/bin, вы проверяете, является ли /home/user/bin/one
это файлом, а не является ли файлом /home/vmware/tobackup /one. Поскольку /home/user/bin/one
не существует, вы не получите выходных данных.
Комментарии:
1. Приведенный выше скрипт сработал. почему это. я добавил вывод в вопросы
2. Ну, я явно запустил команды для составления списка каталогов. Что вам нужно сделать (теперь, когда мы убедились, что у вас есть разрешения и есть файлы / каталоги), так это перейти в этот каталог. (Например,
os.chdir(to_backup)
). Допустим, вы запускаете скрипт из каталога ‘~/bin/’, и os.list_dir(to_backup) = [‘один’, ‘два’, ‘три’, ‘четыре’, ‘пять’]. Затем вы проверяете, является ли os.path.isfile (‘one’) файлом или каталогом в текущем каталоге (которым он не является, поскольку~/bin/one
не существует). Гораздо лучшим решением было бы использоватьos.walk
. docs.python.org/library/os.html#os.walk3. @Mahakaal: Когда ваш скрипт заработает
os.listdir
, у вас будет список['one', 'two', ...]
. Затемos.path.isfile('one')
запустите из /home/vmware, он проверяет, является ли файл /home/vmware / one файлом (которым он не является; он не существует). Вы бы хотели, чтобы он проверял,/home/vmware/tobackup/one
является ли это файлом. Для этого вам нужно либо изменить текущий каталог на/home/vmware/tobackup
(как показано в моем первом решении сos.chdir
), либо убедиться, что вы не проверяете наличие f (это просто ‘one’, ‘two’, но проверяете наличие ‘/ home/ vmware / tobackup / one’ с os.path.join(to_backup, f) в качестве второго soln.4. Спасибо, приятель, это была отличная детализация, твои другие решения работали очень хорошо. я действительно ценю ваши усилия по этому
Ответ №2:
Он работает на моем компьютере (ubuntu 10.10) Возможно, файл /home / vmware / tobackup пуст или у вас нет разрешений на его чтение.
Комментарии:
1. у меня есть все разрешения, команда ls работает, но не команды python
2. ‘pdb’ — ваш друг — вместо того, чтобы угадывать проблему с ошибкой: отладьте ее с помощью pdb
Ответ №3:
os.listdir(dir_name)
возвращает имена файлов относительно именованного каталога. Чтобы использовать их в других командах, вам нужно либо добавить имя каталога (через f = os.path.join(to_backup, f)
в начале тела цикла), либо изменить рабочий каталог на каталог резервной копии перед запуском цикла.
Это первые две альтернативы, показанные в ответе доктора Джимбоба.