У меня есть Карта памяти, которая совместно используется по сети через долю Samba. Это вызвано тем, что содержанием должен управлять удаленный пользователь.
Теперь, существует локальный пользователь с физическим доступом к Карте памяти. После того как удаленный пользователь закончил "управлять" Картой памяти, он дает локальному пользователю команду размонтировать диск для сохранности.
Однако, так как карта флэш-памяти с интерфейсом USB в настоящее время совместно используется по Samba, операция размонтирования не может следовать без процесса Samba за сначала выпуском файловой системы Карты памяти. Это - нежелательный, потому что остановка Samba влияла бы на многих других пользователей, использующих другие доли Samba.
Там какой-либо путь состоит в том, чтобы обойти эту проблему? Или я делаю его неправильно во-первых? Или что, если локальный пользователь просто вытаскивает Карту памяти так или иначе? Это вызовет какие-либо проблемы?
Я предложил бы, чтобы Вы старались избегать from foo import bar
импорт. Я только использую их в пакетах, где разделение на модули является деталью реализации и не будет многих из них так или иначе.
Во всех других местах, куда Вы импортируете пакет, просто использование import foo
и затем ссылаетесь на него полным именем foo.bar
. Таким образом, можно всегда говорить, куда определенный элемент прибывает из и не должен вести список импортированных элементов (в действительности, это всегда устареет и не импортировать больше используемые элементы).
, Если foo
действительно длинное имя, можно упростить его с import foo as f
и затем записать f.bar
. Это все еще намного более удобно и явно, чем поддержание весь from
импорт.
Это действительно имеет несколько недостатков.
На всякий случай Вы хотите протестировать свой модуль посредством модификации во время выполнения, это может сделать это более трудным. Вместо того, чтобы делать
import mymodule
mymodule.othermodule = module_stub
необходимо будет сделать
import othermodule
othermodule.foo = foo_stub
, Это означает, что необходимо будет исправить othermodule глобально, в противоположность просто изменению, на что указывает ссылка в mymodule.
, Это делает это неочевидным, от каких модулей Ваш модуль зависит. Это является особенно раздражающим, если Вы пользуетесь многими сторонними библиотеками или реорганизовываете код.
я должен был поддержать некоторый унаследованный код, который использовал импорт, встроенный повсеместно, он сделал код чрезвычайно трудным осуществить рефакторинг или повторно упаковать.
из-за пути модули кэшей Python, нет хита производительности. На самом деле, так как модуль находится в локальном пространстве имен, существует небольшой выигрыш в производительности к импорту модулей в функции.
import random
def f():
L = []
for i in xrange(1000):
L.append(random.random())
for i in xrange(10000):
f()
$ time python test.py
real 0m1.569s
user 0m1.560s
sys 0m0.010s
def f():
import random
L = []
for i in xrange(1000):
L.append(random.random())
for i in xrange(10000):
f()
$ time python test2.py
real 0m1.385s
user 0m1.380s
sys 0m0.000s
Люди объяснили очень хорошо, почему избежать встроенного импорта, но не действительно альтернативных рабочих процессов для обращения к причинам, Вы хотите их во-первых.
мне нелегко вычищать вверх и вниз по исходным файлам для выяснения то, что импорт модуля доступен и т.д
Для проверки на неиспользованный импорт, который я использую pylint. Это делает статичный (выход) - анализ кода Python и один из (много), вещами, на которые это проверяет, является неиспользованный импорт. Например, следующий сценарий..
import urllib
import urllib2
urllib.urlopen("http://stackoverflow.com")
.. сгенерировал бы следующее сообщение:
example.py:2 [W0611] Unused import urllib2
Что касается проверки доступного импорта, я обычно полагаюсь на (довольно упрощенное) завершение TextMate - когда Вы нажимаете Esc, это завершает текущее слово с другими в документе. Если я сделал import urllib
, urll[Esc]
расширится до urllib
, если не я перейду к запуску файла и добавлю импорт.
С точки зрения производительности Вы видите это: операторы импорта Python должны всегда быть наверху модуля?
В целом, я только использую локальный импорт для повреждения циклов зависимости.
Я полагаю, что это - рекомендуемый подход в некоторых случаях/сценариях. Например, в ленивой загрузке Google App Engine большие модули рекомендуются, так как она минимизирует стоимость прогрева инстанцирования нового Python VMs/interpreters. Взгляните на Инженер Google презентация, описывающая это. Однако имейте в виду, что это не делает средний, Вы должны ленивая загрузка все Ваши модули.
Вы могли бы хотеть смотреть на оператор Import наверху в Python Wiki. Короче говоря: если модуль был уже загружен (взгляд sys.modules
), Ваш код будет работать медленнее. Если Ваш модуль еще не был загружен, и будет foo
только загружаться при необходимости, который может быть нулевыми временами, то общая производительность будет лучше.
Если Ваш локальный пользователь на 100% уверен, что нет никакой программы, сохраняющей файл, открытый на этом диске больше, это sync
управляйте для записи данных из буферов (если таковые имеются) к диску. Затем можно отключить карту флэш-памяти с интерфейсом USB. Из ОПИСАНИЯ sync
записи любые данные, буферизованные в памяти к диску. Это может включать (но не ограничен), измененные суперблоки, изменил inodes и задержал чтения и записи. Это должно быть реализовано ядром; sync
программа действительно только тренируется sync
системный вызов.
Ядро сохраняет данные в памяти, чтобы не делать (относительно медленное) чтение с диска и записи. Это улучшает производительность, но если компьютер отказывает, данные могут быть потеряны, или файловая система повреждается в результате. sync
команда гарантирует, что все в памяти записано в диск.
Любые аргументы проигнорированы, за исключением одинокого --help
или --version
(*note Общий options::).
Статус выхода нуля указывает на успех, и ненулевое значение указывает на отказ.