Більше

Чому цей сценарій Python працює лише один раз на QGIS?


У мене є сценарій Python для зміни кольору деяких специфічних функцій (рядків) за допомогою категорій у векторному шарі. Коли я імпортую сценарій у консолі, перший раз через консоль він працює нормально. Але (поки qgis відкритий), коли я редагую сценарій і змінюю колір якоїсь категорії на «червоний» замість попереднього «зеленого», а потім знову імпортую сценарій, він не відображає змін, рядки мають однаковий колір як раніше. Ось сценарій та кілька зображень:

з PyQt4.QtGui імпорт * з PyQt4.QtCore імпорт * з qgis.core імпорт * з qgis.utils імпорт iface def change_color (): active_layer = iface.activeLayer () трубопровід = [["1", "зелений"], [ "2", "червоний"], ["3", "зелений"], ["4", "зелений"], ["5", "зелений"]] категорії = [] для етикетки, кольору в конвеєрі: symbol = QgsSymbolV2.defaultSymbol (active_layer.geometryType ()) symbol.setColor (QColor (color)) category = QgsRendererCategoryV2 (int (label), symbol, label) categories. , категорії) active_layer.setRendererV2 (renderer) active_layer.setCacheImage (None) iface.mapCanvas (). refresh () iface.legendInterface (). refreshLayerSymbology (active_layer) change_color ()

Тепер, скажімо, наприклад, що я редагую сценарій і змінюю конвеєр на:

конвеєр = [["1", "зелений"], ["2", "червоний"], ["3", "червоний"], ["4", „зелений“], [„5“, „червоний "]]

і знову запустіть скрипт. Тоді він повинен показувати 3 червоні лінії замість 1. Але це не так! Сподіваюся, я був досить чітким. (Я навіть не наближений до розробника.)


Думаю, знайшов. Якщо я використовую >>> execfile замість >>> import (ім'я сценарію), він працює стільки разів, скільки мені потрібно, не закриваючи QGIS


Як перезапустити скрипт Python автоматично, якщо він убитий або загине

Тепер, можливо, на якомусь етапі мій вищезазначений сценарій Python може загинути з будь-якої причини.

Тож я думаю мати якийсь агент cron у скрипті оболонки bash, який може автоматично перезапустити мій вищезазначений сценарій Python, якщо його вбивають з якоїсь причини.

Чи можливо це зробити? Якщо так, то який найкращий спосіб вирішити подібні проблеми?

Після створення файлу testing.conf таким чином -

Я запустив команду sudo, щоб її запустити, але я не бачу, як цей процес працює позаду ps ax?

Будь-яка ідея, чому px ax мені нічого не показує? І як мені перевірити, працює моя програма чи ні?


Типи файлів

Те, що ви можете знати як файл, дещо відрізняється в Python.

Наприклад, у Windows файлом може бути будь-який елемент, яким користувач / ОС маніпулює, редагує або створює його. Це означає, що файлами можуть бути зображення, текстові документи, виконувані файли та файли Excel та багато іншого. Більшість файлів організовано, зберігаючи їх в окремих папках.

У Python файл класифікується як текстовий або двійковий, і різниця між двома типами файлів є важливою.

Текстові файли структуровані як послідовність рядків, де кожен рядок містить послідовність символів. Це те, що ви знаєте як код або синтаксис.

Кожен рядок закінчується спеціальним символом, який називається EOL або Кінець рядка характер. Існує кілька типів, але найпоширенішим є кома <,> або символ нового рядка. Він закінчує поточний рядок і повідомляє перекладачу, що новий розпочався.

Також може використовуватися символ зворотної косої риски, і він повідомляє інтерпретатору, що наступний символ - після косої риси - слід розглядати як новий рядок. Цей символ корисний, коли ви не хочете починати новий рядок у самому тексті, а в коді.

Двійковий файл - це файл будь-якого типу, який не є текстовим файлом. Через свою природу двійкові файли може обробляти лише програма, яка знає або розуміє структуру файлу. Іншими словами, це повинні бути програми, які можуть читати та інтерпретувати двійкові файли.


Сценарій міграції бази даних

Я працюю над сценарієм міграції бази даних, написаним на python, який буде брати дані з бази даних MySQL та вставляти їх у базу даних PostgreSQL з іншою схемою (різні структури таблиць, різні типи даних тощо).

Виступи мають значення, оскільки мені доведеться обробляти значні бази даних.

Я використовую адаптери mysql.connector та psycopg2 для того, щоб вести розмови python з двома базами даних.

Моя проблема полягає в тому, що мені потрібна продуктивність, а також сила модифікації / перетворення даних MySQL перед вставкою рядків у нову базу даних. Я наведу вам приклад, щоб показати, чому насправді існує конфлікт інтересів.

Далі - фрагмент коду без продуктивності оптимізація, але принаймні, де перетворення/перетворення даних було можливим:

Як ви можете бачити тут, у мене є можливість зробити оператор if для кожного рядка, отриманого з mysql, наприклад. помістіть значення поля всередину іншого поля (або типу даних кастингу тощо). Що є тим, що мені дійсно потрібно зробити за моїм сценарієм (опрацювання db рядка).

Тим часом я з'ясував, що виконувати багато операторів вставки, як зазначено вище (кожен рядок mysql вставляється окремо) вбивство продуктивності.

Тому я думаю перейти на щось подібне, яке готує всі блоки операторів, а потім вставити все це в один блок:

При такому підході сценарій може бути приблизно в 100 разів швидшим! Але проблема в цьому полягає, що я більше не можу обробляти дані (перетворення / перетворення / лиття.), оскільки всі рядки вставляються в об'єкт, і я більше не можу перебирати його.


Python у реальному світі¶

Наскільки стабільний Python? ¶

Дуже стабільний. Нові стабільні випуски виходять приблизно кожні 6 - 18 місяців з 1991 року, і це, мабуть, триватиме. Починаючи з версії 3.9, Python матиме основний новий випуск кожні 12 місяців ( PEP 602).

Розробники видають випуски виправлень старих версій, тому стабільність існуючих версій поступово покращується. Випуски виправлень, позначені третім компонентом номера версії (наприклад, 3.5.3, 3.6.2), керуються для стабільності, лише виправлення для відомих проблем включаються у випуск виправлення, і гарантується, що інтерфейси залишаться незмінними протягом серія випусків виправлень.

Останні стабільні випуски завжди можна знайти на сторінці завантаження Python. Існує дві готові до виробництва версії Python: 2.x та 3.x. Рекомендована версія 3.x, яка підтримується найбільш широко використовуваними бібліотеками. Хоча 2.x все ще широко використовується, він більше не підтримується.

Скільки людей використовує Python? ¶

Користувачів, ймовірно, мільйони, хоча отримати точний рахунок важко.

Python доступний для безкоштовного завантаження, тому даних про продажі немає, він доступний на багатьох різних сайтах і упакований багатьма дистрибутивами Linux, тому статистика завантажень також не розповідає всієї історії.

Група новин comp.lang.python дуже активна, але не всі користувачі Python розміщують повідомлення в групі або навіть читають її.

Чи були зроблені якісь важливі проекти в Python? ¶

Список проектів, які використовують Python, див. На https://www.python.org/about/success. Консультації з матеріалів минулих конференцій Python виявлять внески багатьох різних компаній та організацій.

До гучних проектів Python належать менеджер списків розсилки Mailman та сервер додатків Zope. Декілька дистрибутивів Linux, зокрема Red Hat, написали частину або всю програму встановлення та системного адміністрування на Python. Компанії, які використовують Python внутрішньо, включають Google, Yahoo та Lucasfilm Ltd.

Які нові розробки очікуються для Python у майбутньому? ¶

Див. Https://www.python.org/dev/peps/ щодо пропозицій щодо вдосконалення Python (PEP). PEP - це проектні документи, що описують запропоновану нову функцію Python, забезпечуючи стислу технічну специфікацію та обгрунтування. Шукайте PEP під назвою „Розклад випуску Python X.Y”, де X.Y - це версія, яка ще не публікувалася.

Нова розробка обговорюється у списку розсилки python-dev.

Чи розумно пропонувати несумісні зміни до Python? ¶

Загалом, ні. Вже існує мільйони рядків коду Python по всьому світу, тому будь-яка зміна мови, яка робить недійсною лише дуже незначну частину існуючих програм, повинна бути згорджена. Навіть якщо ви можете запропонувати програму перетворення, все ще існує проблема оновлення всієї документації, яку написано багато книг про Python, і ми не хочемо зневажати їх усі одним натисканням.

Якщо потрібно змінити функцію, необхідно забезпечити поступовий шлях оновлення. PEP 5 описує процедуру введення несумісних назад змін, мінімізуючи порушення для користувачів.

Чи хороша мова Python для початківців програмістів? ¶

Все ще прийнято починати студентів із процедурної та статично набраної мови, такої як Pascal, C або підмножина C ++ або Java. Студентам може бути краще послужити, вивчаючи Python як їх першу мову. Python має дуже простий і послідовний синтаксис і велику стандартну бібліотеку, і, що найголовніше, використання Python на початковому курсі програмування дозволяє студентам сконцентруватися на таких важливих навичках програмування, як декомпозиція проблем та дизайн типу даних. За допомогою Python студентів можна швидко ознайомити з основними поняттями, такими як цикли та процедури. Можливо, вони навіть можуть працювати з визначеними користувачем об’єктами на своєму першому курсі.

Для студента, який ніколи раніше не програмував, використання статично набраної мови здається неприродним. Це представляє додаткову складність, якою повинен володіти студент, і уповільнює темп курсу. Студенти намагаються навчитися мислити як комп’ютер, розкладати проблеми, розробляти послідовні інтерфейси та інкапсулювати дані. Хоча навчитися користуватися статично набраною мовою важливо в довгостроковій перспективі, це не обов'язково найкраща тема для вивчення на першому курсі програмування студентів.

Багато інших аспектів Python роблять його гарною першою мовою. Як і Java, Python має велику стандартну бібліотеку, завдяки якій студентам дуже рано можна призначити проекти програмування робити щось Призначення не обмежуються стандартним чотирифункціональним калькулятором і програмами балансування перевірок. Використовуючи стандартну бібліотеку, студенти можуть отримати задоволення від роботи над реалістичними додатками, коли вивчають основи програмування. Використання стандартної бібліотеки також вчить учнів про повторне використання коду. Сторонні модулі, такі як PyGame, також корисні для розширення охоплення студентів.

Інтерактивний перекладач Python дозволяє студентам перевіряти мовні особливості під час програмування. Вони можуть тримати вікно з запущеним перекладачем, коли вони вводять джерело своєї програми в інше вікно. Якщо вони не можуть запам’ятати методи для списку, вони можуть зробити щось подібне:

З перекладачем документація ніколи не далека від студента, оскільки він програмує.

Існують також хороші IDE для Python. IDLE - це платформа IDE для Python, яка написана на Python за допомогою Tkinter. PythonWin - це спеціальна середовище розробки середовища для Windows. Користувачі Emacs будуть раді дізнатися, що для Emacs існує дуже хороший режим Python. Всі ці середовища програмування забезпечують підсвічування синтаксису, автоматичний відступ та доступ до інтерактивного інтерпретатора під час кодування. Зверніться до вікі-версії Python, щоб отримати повний перелік середовищ для редагування Python.

Якщо ви хочете обговорити використання Python в освіті, можливо, вам буде цікаво приєднатися до списку розсилки edu-sig.


Обробник frame_change_pre працює лише один раз

Я намагаюся змінити текстовий об'єкт на кожному кадрі в Blender 2.75a, використовуючи код попередньої відповіді (Як я можу зробити динамічний текст в анімації?). З моїм сценарієм текстове значення походить від властивості об'єктива камери, яка має ключовий кадр.

Я додав сценарій до файлу блендера і змінив його, щоб використовувати значення об'єктива камери. Коли я натискаю Запустити сценарій, а потім переміщую кадр, він оновлює текстовий об’єкт у вікні тривимірного перегляду, як очікувалося. Але тоді, коли я переміщую інший кадр, він не оновлюється. Це також не працює для Alt + A або якщо я відображаю послідовність кадрів.

За пропозицією Рей я додав функцію друку, яка показувала значення кадру та об'єктива. Коли я переміщав кадр вперед і назад, номер кадру оновлювався, однак значення лінзи змінювалось лише вперше після натискання кнопки «Запустити сценарій», а потім залишалося незмінним у консолі. Значення лінзи змінювалося в інтерфейсі користувача.

Я пробував код для очищення обробників (frame_change_pre.clear ()) і закриття Blender і повторного відкриття, щоб скинути все, і відбувається та сама поведінка.

Пропозиція Зеффія щодо переміщення лінії об'єктива camera_lens = bpy.data.cameras ['Camera']. У функцію частково спрацювала.

Зараз я розумію проблему (дякую всім): при першому запуску сценарію він встановлює обробник та встановлює змінну зі значенням лінзи. З цього моменту, коли кадр рухається, обробник виконує лише функцію, а оскільки змінна, що містить значення лінзи, знаходиться поза функцією, вона ніколи не оновлюється. Переміщення призначення змінної лінзи всередину функції означає, що вона оновлюється кожного разу, коли викликається обробник.

Однак зараз оновлення відстає на один кадр. тобто:

  • початок з кадру 1, інтерфейс користувача та тривимірний вигляд = 16,0.
  • Перейти до кадру 2, UI = 16,9, тривимірний вигляд = 16,0.
  • Перейти до кадру 3, UI = 17,8, тривимірний вигляд = 16,9.

Я припускаю, що обробник python виконується до обчислення значення ключового кадру. Спробував змінити на frame_change_post, але, здається, це теж не спрацювало. пропозиції?


Raspberry PI GPIO не працює

Я щойно отримав малинову модель пі 3 В + і написав кілька сценаріїв для створення світлодіодного візерунка. Все працювало, а потім раптом зупинилося. Тепер кожного разу, коли я запускаю скрипт python через sudo python #scriptName консоль аварійно завершує роботу, це означає, що я більше не можу запускати код python або вимикати комп'ютер, не витягуючи акорду живлення, я не можу ctrl + C, оскільки він просто друкує ^ c на екран консолі, і в жодній програмі python не використовується команда kill. Без Cobbler підключений код іноді запускатиметься, але з ним підключена консоль зависає. Також світлодіод, підключений до хлібної дошки, тьмяно світиться, не вмикаючи GPIO при запуску, і залишається увімкненим, поки я не вимкну його з консолі. Я щось перегорів? Чи може хтось запропонувати мені пораду щодо того, що відбувається? Мій пробний сценарій

Ось картинка проблеми. Ось зображення схеми, яку я створив


2 відповіді 2

Будь ласка, перегляньте мою РЕДАГУВАТИ в кінці цієї відповіді.

Переклад: "Кожну 30-ту хвилину за кожну годину з 16 по 23 та 0 в кожен день тижня з понеділка по п’ятницю".

Перша відповідь пропускає, оскільки вона не запускається кожні півгодини. Можливо, ви могли б закрутитися навколо цього, помістивши сплячий режим у свій код:

Переклад: "О 0-й хвилині та кожній 30-й хвилині за кожну годину з 16 по 23 та 0 в кожен день тижня з понеділка по п’ятницю".

Друга відповідь пропущена, оскільки вона працює о 16:00, за 30 хвилин до того, коли ви бажали розпочати. Можливо, це "більш" відповідність вашим заявленим вимогам, якщо це не має значення. Якщо це має значення, і ви можете почекати до 17:00, то просте зміна розкладу подбає про це:

РЕДАКТУВАТИ: У мене був розумовий блокада. Мені спало на думку, що є точний відповідь на ваше запитання. Це має мати 3 записи crontab замість лише 2:


Kivy та створення APK-файлів

Якщо ви хочете піти далі, то вам доведеться скористатися Kivy. Kivy в основному широко розкриває двері, дозволяючи нам створювати повнофункціональні програми для Android з мультитач, графікою тощо. І це також, як ви можете перетворити свої сценарії Python у файли .apk, які ви можете встановити безпосередньо на свій пристрій Android або навіть розповсюджувати через Play Store. Найкраще, що Kivy також є крос-платформенним, тому ви можете створювати програми для різних платформ таким чином.

Тепер ми можемо показувати елементи інтерфейсу, такі як кнопки та полотна з графікою. Як дегустатор, ось як може виглядати трохи коду для показу кнопки:

Однак для цього нам потрібно запустити Kivy на ПК. Ви можете розробляти через Kivy для Windows, але якщо ви хочете створювати APK-файли, тоді я рекомендую замість цього використовувати Linux. Проблема полягає в тому, що створення файлів .apk зі сценаріїв Python - це все-таки довготривалий і складний процес у Windows, який передбачає встановлення декількох бібліотек, Android NDK, встановлення шляхів тощо. Це складно, аж до того, що бути майже неможливим.

На щастя, існує інструмент, який може впоратися з усіма важкими вантажами, який називається "Buildozer". Це не працює в Windows, але, на щастя, досить легко налагодити роботу Linux на віртуальній машині через VirtualBox, а потім завантажити образ диска з Kivvy, який постачається з усім необхідним для створення ваших додатків. Прочитайте файл README.txt, який постачається з вашою віртуальною машиною, і він продемонструє вам все, що вам потрібно знати. Після того, як ви введете команди, доручені в терміналі, вам залишиться лише відредагувати файл „buildozer.spec“. Тут ви введете такі речі, як ім’я вашого додатка, ім’я пакета та будь-які інші файли, які потрібно включити.

Повну інформацію та все необхідне для завантаження ви можете знайти тут. Це також чудова можливість пограти з Linux, спробувати завантажити якесь додаткове програмне забезпечення і т. Д. Якщо вам подобається Ubuntu, не забувайте спілкуватися - я покажу вам, як запустити його на своєму пристрої Android у наступному дописі!

Ймовірно, вам доведеться оновити кілька речей та встановити IDE (наприклад, Ninja IDE) та змінити різні налаштування. Досить сказати, що це все ще не зовсім «підключи і працюй», і насправді, на цьому етапі вам було б краще дотримуватися Android Studio та Java. Я дійсно щойно включив цей розділ, щоб продемонструвати, що можна створювати програми в Python, якщо ви цього бажаєте. Здебільшого я рекомендую дотримуватися QPython і використовувати його як місце для випробування коду і, можливо, зробити собі кілька зручних інструментів.


4 відповіді 4

Це відбувається тому, що, як правило, коли процес STDOUT перенаправляється на щось інше, ніж термінал, висновок буферизується в якийсь буфер специфічного розміру для ОС (можливо, 4k або 8k у багатьох випадках). І навпаки, при виведенні на термінал STDOUT буде буферизованим або взагалі не буферизованим, тому ви побачите результат після кожного n або для кожного символу.

Зазвичай ви можете змінити буферизацію STDOUT за допомогою утиліти stdbuf:

Тепер, якщо ви одержуєте журнал -F, ви повинні побачити кожен вихідний рядок негайно, коли він генерується.


Перегляньте відео: QGIS Конвертація (Жовтень 2021).