как насчет проверки версии Python, которую вы используете в первую очередь.
import six
if six.PY2:
import ConfigParser as configparser
else:
import configparser
Общее высказывание Python состоит в том, что легче спросить прощение, чем разрешение. В то время как я не поклонник этого оператора в реальной жизни, он действительно применяется в большом количестве случаев. Обычно Вы хотите избежать кода, что цепочки два системных вызова на том же файле, потому что Вы никогда не знаете то, что произойдет с файлом, промежуточным Ваши два вызова в Вашем коде.
А типичная ошибка состоит в том, чтобы записать что-то как :
if os.path.exists(path):
os.unlink(path)
второй вызов (os.unlink) может перестать работать, если что-то еще удалило его после Вашего, если тест, повысьте Исключение и остальную часть остановки Вашей функции от выполнения. (Вы могли бы думать, что этого не происходит в реальной жизни, но мы просто ловили другую ошибку как этот из нашей кодовой базы на прошлой неделе - и это был вид ошибки, которая оставила несколько программистов, царапающих их голову и требующих 'Heisenbug' в течение последних нескольких месяцев)
Так, в Вашем особом случае, я, вероятно, сделаю:
try:
os.stat(path)
except OSError, e:
if e.errno == errno.ENOENT:
print 'path %s does not exist or is a broken symlink' % path
else:
raise e
раздражение здесь - то, что статистика возвращает тот же код ошибки для символьной ссылки, которая просто не является там и поврежденная символьная ссылка.
Так, я предполагаю, что у Вас нет выбора, чем повредить атомарность и сделать что-то как
if not os.path.exists(os.readlink(path)):
print 'path %s is a broken symlink' % path
os.lstat () может быть полезным. Если lstat () успешно выполняется и статистика () сбои, то это - вероятно, неработающая ссылка.
Я могу упомянуть, что тестировал на hardlinks без Python?/bin/test имеет условие FILE1-ef FILE2, которое верно, когда файлы совместно используют inode.
Поэтому что-то как find . -type f -exec test \{} -ef /path/to/file \; -print
работы для тестирования жесткой ссылки в определенный файл.
, Который приносит мне к чтению man test
и упоминания о -L
и -h
, который и работают над одним файлом и возвращают true, если тот файл является символьной ссылкой, однако который не говорит Вам, если цель отсутствует.
я действительно находил, что head -0 FILE1
возвратит код выхода 0
, если файл может быть открыт и 1
, если он не может, который в случае символьной ссылки на регулярный файл работает тестом для того, является ли это целью, может быть считан.
можно попытаться использовать realpath () для получения то, на что символьная ссылка указывает на, затем пытаясь определить, является ли это использование правильного файла, файл.
(я не в состоянии испытать это в данный момент, таким образом, необходимо будет играть вокруг с ним и видеть то, что Вы получаете)
Я не парень Python, но это похоже на os.readlink ()? Логика, которую я использовал бы в жемчуге, должна использовать readlink (), чтобы найти, что цель и статистика использования () тестируют, чтобы видеть, существует ли цель.
Редактирование: Я строчил некоторый жемчуг, это демонстрирует readlink. Я верю статистике и readlink perl и os.stat Python (), и os.readlink () являются оба обертками для системных вызовов, таким образом, это должно перевести разумный хорошо как код подтверждения концепции:
wembley 0 /home/jj33/swap > cat p
my $f = shift;
while (my $l = readlink($f)) {
print "$f -> $l\n";
$f = $l;
}
if (!-e $f) {
print "$f doesn't exist\n";
}
wembley 0 /home/jj33/swap > ls -l | grep ^l
lrwxrwxrwx 1 jj33 users 17 Aug 21 14:30 link -> non-existant-file
lrwxrwxrwx 1 root users 31 Oct 10 2007 mm -> ../systems/mm/20071009-rewrite//
lrwxrwxrwx 1 jj33 users 2 Aug 21 14:34 mmm -> mm/
wembley 0 /home/jj33/swap > perl p mm
mm -> ../systems/mm/20071009-rewrite/
wembley 0 /home/jj33/swap > perl p mmm
mmm -> mm
mm -> ../systems/mm/20071009-rewrite/
wembley 0 /home/jj33/swap > perl p link
link -> non-existant-file
non-existant-file doesn't exist
wembley 0 /home/jj33/swap >