Скрипт Python не работает в Linux

#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.walk

3. @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) в начале тела цикла), либо изменить рабочий каталог на каталог резервной копии перед запуском цикла.

Это первые две альтернативы, показанные в ответе доктора Джимбоба.