Python & MySql
можно ли из ру проверить, запущен ли на машине (той же самой) mysql, и запустить его если нет?
я уверен, что на ру "можно все, что могут другие", нужно только знать как : )
сейчас запускаю руками командой path/mysqld -- console. когда больше не нужен - останавливаю.
в принципе могу и дальше так жить, но мне для моих задач удобнее было бы, если бы он запускался "автоматически".
есть (и будут появляться) и другие вопросы, надеюсь, кто-нибудь сможет не них найти ответы.
Ну, самое простое, наверное, попытаться соедениться с мусклем на локальном хосте. Должно даже одинаково и на линуксе и на виндусях работать.
Можно быстрее, но сложнее. Запускать mysql status. Емнип он дает exit code 0, если мускль работает.
а не подскажете, почему может быть такое. вот так запускаю майэскуэл:
>>> args = ['--console']
>>> pid = os.spawnv(os.P_NOWAIT, 'd:/mysql/bin/mysqld', args)
, он стартует, но не выдает ничего на консоль, а пишет в лог, будто проигнорировал параметр : (
Почему быи нет. Кроме привязки к виндусям (.exe) всё нормально. Будет работать в 99% случаев. 1% это когда сервис бегает, но полумёртвый.
Да, ещё одно - стоит убедиться что psutil вернёт процессы всех пользователей.
у меня в итоге должно будет все бежать под каким-нибудь юниксоидом, но разрабатывать там мне несподручно. с другой стороны, чрезмерным универсализмом "для всех случаев и навека" заниматься неохота, поэтому разработается как есть, затем отладится там, где будет применяться, мне так (думаю пока) проще.
будто проигнорировал параметр
Как сказал MrSanders "первым элементом в args должно быть имя команды."
https://docs.python.org/2/library/os.html#process-manageme...
In either case, the arguments to the child process must
start with the name of the command being run.
оказывается, даже если в класс обернуть, все равно будет торчать наружу:
“Private” instance variables that cannot be accessed except from inside an object don’t exist in Python. However, there is a convention that is followed by most Python code: a name prefixed with an underscore (e.g. _spam) should be treated as a non-public part of the API (whether it is a function, a method or a data member). It should be considered an implementation detail and subject to change without notice.
немножко подразочаровывает : (
но я опробовал основные "механизмы", которые мне нужны, все отлично работает, и, уверен, код, который напишу, будет правильно работать. но хотелось бы где-нибудь отсмотреть выработанную "практику хорошего кодирования" на пайтоне, чтобы не изобретать велосипед и не
наступать на грабли. где?
я тоже пока не понимаю, почему. просто ожидал другого. это для меня как если бы в си объявление const отсутствовало (или компилятор его игнорировал), и просто существовало бы соглашение, что если вы не хотите, чтобы объект кто-то менял, начните его ид с чего-то там. и не меняйте такие объекты. просто давайте повыбрасываем все замки и договоримся, что никто не будет воровать или трогать что-то, на чем написано "мое" : )
я продолжу в этой ветке вопросы, не всегда касающиеся темы, возможно, этот вопрос следовало бы задать в разделе вэбхостинг, но там, похоже, заповедник, который редко посещается.
имеется сайт у провайдера, там в "корне" - index.html. я хочу каким-нибудь образом выполнить на сервере python-файл. думал (такой наивный!), вот сейчас переименую index.html -> index.html.bak, запишу туда index.py со строчкой print 'hello, world!', и, зайдя на сайт, увижу эту фразу. но вижу другое.
кто подскажет, как это правильно сделать? есть только ftp, для ssh нужно что-то дополнительно предпринять, хотелось бы обойтись насколько возможно. python у них установлен, я знаю где находится.
а я прочитал, что можно так:
помещаем в корень файл index.php:
<!--filtered--> <!--filtered--> <!--filtered--> <!--filtered-->"; $command= escapeshellcmd('/usr/bin/python/python test0.py'); $output = shell_exec($command); echo $output; echo "bye PHP"; ?> <!--filtered--> <!--filtered-->
и здесь же лежит файл test0.py
#!/usr/bin/env python print 'here python'
но вижу только
hi php
bye php
правда, mod test0.py 644, и я не знаю, как его поменять без ssh : (
oops!!! отфильтровало часть тэгов. но смысл понятен, думаю.ну вот, стоило только людям пожаловаться, как все решилось : ) "не стреляла потому что незаряженная была". почему-то дважды напечатал (как баден-баден : ), а нужно было
$command= escapeshellcmd('/usr/bin/python test0.py');
и не нужно ему 777, как все везде утверждают. в общем, кажется, все опробовано, можно начинать творить : )
а почему вам это не нравится? читал, можно еще чрез cgi запустить, но не вижу, чем это лучше. еще читал, можно сделать что-то типа "интегрировать пайтон в пхп-скрипт", или что-то такое. ускорение происходит, т.к. интерпретатор пайтона активируется один раз при старте сервера, а не каждый раз при обращении к странице. но отладка будет геморройной: после каждой мелочи нужно перезапускать сервер.
у меня сейчас новый вопрос возник. вчера попробовал отправить из пайтона имэйл. получилось, но я должен в коде указать имя/пароль в открытом виде, что мне не нравится. понимаю, что это как поднять себя за волосы, но что можно придумать, не выкладывая пароль в открытом виде и не запрашивая его в интерактиве?
я не специалист в дырках в безопасности, поэтому не понимаю, кто и как может эту дырку использовать. если бы вы могли "на пальцах" объяснить. только без "если кто-то получит root" или если у меня появятся злые умыслы. имеется ввиду злое замыслил the man in the middle attack.
снова чайниковый вопрос. начитался на тему - уже "кушать не могу", но с какой стороны коней запрягать, так и не понял.
имею класс, которому переписал __str__() (так понимаю, это - аналог toString() в других языках), в надежде печатать эту строчку потом просто, "печатая объект класса"
class ClassA (object) ... def __str__(self): return self._somestring ...
пытаюсь использовать:
obj = ClassA() s = obj.__str__() print s # ok print obj # exception: 'ascii' codec can't encode character u'\xfc' in position 36: ordinal not in range(128)
кто расскажет, почему присвоение того, что возвращает __str__ напрямую, позволяет себя напечатать, а "то же самое" оказывается не совсем то же самое?
ну вот снова: стоило людям пожаловаться, как нашел простое объяснение:
https://stackoverflow.com/questions/1307014/python-str-ver...
... но все равно ничего не понимаю : (
почему print всегда использует acsii codec? как сделать так, чтобы он использовал другой?
кто и как может эту дырку использовать.
Вы, как клиент провайдера. На своём собственном апаче можно и не запрещать пхп запускать процессы. Но если вы провайдер...
1. Вы не даёте клиенту SSH доступ. Благодаря процессам их php он его "получает".
2. Даже если у вашего клиента есть доступ по SSH. По ssh он логинится как vasja, с кучей ограничений и как бы вообще не в своем заchroot-енном окружении. А вот процессы запущенные апачевским php модулем будут бегать под апачевским пользователем. Вряд ли провайдер запускает апач под каждого клиента.
ssh можно получить, отправив им скэн своего паспорта. им просто нужно знать, тот ли я на самом деле, за кого себя выдаю (до сих пор я мог назваться кем угодно, и даже заграницей находиться).
при случае распечатаю, под каким пользователем выполняется пайтон, это легко опросить. думаю, это окажусь я : )
а с "принт" не можете объяснить? я так понимаю, что если класс не переписал __str__(), то print obj напечатает что-то типа object of class blablabla 0x0000000000012345. а если переписать, то будет печатать то, что эта функция выдает. и вот получаетя, что если я вызываю эту функцию напрямую (print obj.__str__() ), то print ведет себя иначе, чем если print obj. ф-я возвращает юникод, и в первом случае принт выводит то, что там закодировано, а во втором - пытается декодировать с помощью ascii codec (видимо), и выдает особый случай, если встречает байт больше 128. могу, конечно, отказаться от print obj, но хочется понять, как работает это на самом деле. желательно, не залезая в исходник от print() (а если вы не поможете, то придется)
догадываюсь, что там происходит. расскажу мою догадку.
встроенная функция print() смотрит на тип, который она получает в аргументах. если он unicode - декодирует его и печатает. если это - объект какого-то класса, то вызывает его __str__() исходя из того, что та должна (как говорит название), вернуь не юникод, а str. и декодирует соотв. кодеком ascii (пытается). дефолтная __str__() выдаст str "<class '... .ClassA'>". а если мы ее переписываем,
то должны вернуть str, а не unicode. а я возвращаю unicode. но вчера целый день "читал гоголя" на эту тему, и везде очень длинно рассуждают, что такое юникод и кодирование вообще, и ничего конкретно о моем случае.
если моя догадка правильна, то не вижу решения (пока), кроме как переписать ф-ю не __str__, а __unicode__, и печатать print obj.__unicode__()
почему print всегда использует acsii-encoding?
Не всегда. acsii - это только кодировка по умолчанию. https://docs.python.org/2/library/locale.html?highlight=lc...
object.__str__(self) Called by the str() built-in function and by the print statement to compute the “informal” string representation of an object. The return value must be a string object.
В python есть типы данных string и unicode. Для unicode используется object.__unicode__(self)
это все я вчера многократно прочитал. чего я не нашел, это как сделать так, чтобы print obj печатала символы, не являющиеся частью ascii. можете набросать работающий пример из нескольких строчек? класс возьмем такой:
class ClassA(object): def __init__(self): self.s = 'München'я хочу, чтобы
... cls = ClassA() ... print cla ...выдавало München.
прочел эту статью:
http://kmike.ru/python-with-strings-attached/
, и понял, что сделать то, что я хочу "красиво" не получится, и бросаю эту затею.
https://docs.python.org/2.7/reference/lexical_analysis.htm...
Проверь для начала, в какой кодировке у тебя сами скрипты, и соответствует ли ей декларация кодировки в заголовке скриптов.
в моем случае кодировка скриптов до лампочки. "München" у меня не в скрипте, я его беру на стороне, это я для наглядности в примере его в скрипт вставил. факт тот, что print obj печатает результат, возвращаемый __str__ этого объекта, и предполагает, что там - строка ascii (и она ОБЯЗАНА возвращать именно это).
ладно, с этим разобрались. теперь решил загрузить на сервер mysql базу. прочитал, что это просто: делаешь дамп и импортируешь файл в phpmyadmin. c mysqldump все прошло быстро и красиво, а с импортом - сплошные неприятности. сперва он начал непонимать комментарии. повыбрасывал, ругается дальше. кто-нибудь делал подобные вещи? у них нечто mariadb. mysql-образное что-то.