Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Python & MySql

753  1 2 все
  moose старожил30.09.18 12:14
30.09.18 12:14 

можно ли из ру проверить, запущен ли на машине (той же самой) mysql, и запустить его если нет?

я уверен, что на ру "можно все, что могут другие", нужно только знать как : )

сейчас запускаю руками командой path/mysqld -- console. когда больше не нужен - останавливаю.

в принципе могу и дальше так жить, но мне для моих задач удобнее было бы, если бы он запускался "автоматически".

есть (и будут появляться) и другие вопросы, надеюсь, кто-нибудь сможет не них найти ответы.

#1 
NightWatch коренной житель30.09.18 12:31
NightWatch
NEW 30.09.18 12:31 
в ответ moose 30.09.18 12:14
  moose старожил30.09.18 13:06
NEW 30.09.18 13:06 
в ответ NightWatch 30.09.18 12:31

спасибо! уверен, по этой ссылке найду все необходимое.

#3 
MrSanders старожил30.09.18 14:18
NEW 30.09.18 14:18 
в ответ moose 30.09.18 12:14, Последний раз изменено 30.09.18 14:19 (MrSanders)

Ну, самое простое, наверное, попытаться соедениться с мусклем на локальном хосте. Должно даже одинаково и на линуксе и на виндусях работать.

Можно быстрее, но сложнее. Запускать mysql status. Емнип он дает exit code 0, если мускль работает.

#4 
  moose старожил30.09.18 18:07
NEW 30.09.18 18:07 
в ответ MrSanders 30.09.18 14:18

а покритикуйте это (или вроде этого):


import psutil
mysqld_found = False
for proc in psutil.pricess_iter():
    if prioc.name() == 'mysqld.exe':
        # mysqld is running
        mysqld_found = True
        break;
if not mysqld_found:
    # start mysqld ...
...
#5 
  moose старожил30.09.18 19:39
NEW 30.09.18 19:39 
в ответ NightWatch 30.09.18 12:31

а не подскажете, почему может быть такое. вот так запускаю майэскуэл:


>>> args = ['--console']
>>> pid = os.spawnv(os.P_NOWAIT, 'd:/mysql/bin/mysqld', args)

, он стартует, но не выдает ничего на консоль, а пишет в лог, будто проигнорировал параметр : (


#6 
MrSanders старожил30.09.18 20:01
NEW 30.09.18 20:01 
в ответ moose 30.09.18 18:07, Последний раз изменено 30.09.18 20:25 (MrSanders)

Почему быи нет. Кроме привязки к виндусям (.exe) всё нормально. Будет работать в 99% случаев. 1% это когда сервис бегает, но полумёртвый.

Да, ещё одно - стоит убедиться что psutil вернёт процессы всех пользователей.

#7 
MrSanders старожил30.09.18 20:30
NEW 30.09.18 20:30 
в ответ moose 30.09.18 19:39

мне смутно помнится что первым элементом в args должно быть имя команды. вроде

args=['mysqld','--console']
#8 
  moose старожил30.09.18 21:16
NEW 30.09.18 21:16 
в ответ MrSanders 30.09.18 20:01

у меня в итоге должно будет все бежать под каким-нибудь юниксоидом, но разрабатывать там мне несподручно. с другой стороны, чрезмерным универсализмом "для всех случаев и навека" заниматься неохота, поэтому разработается как есть, затем отладится там, где будет применяться, мне так (думаю пока) проще.

#9 
  moose старожил30.09.18 21:16
NEW 30.09.18 21:16 
в ответ MrSanders 30.09.18 20:30

спасибо, завтра попробую, наверное, заработает (ведь должно бы как-то)

#10 
NightWatch коренной житель01.10.18 10:14
NightWatch
NEW 01.10.18 10:14 
в ответ moose 30.09.18 19:39
будто проигнорировал параметр

Как сказал 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.

#11 
  moose старожил03.10.18 22:11
NEW 03.10.18 22:11 
в ответ MrSanders 30.09.18 20:30

спасибо, получилось.


попутный вопрос от чайника. неужели нельзя иметь переменную, видимую только в скопе модуля, не создавая классов?

#12 
MrSanders старожил04.10.18 09:46
NEW 04.10.18 09:46 
в ответ moose 03.10.18 22:11

А вот для таких вопросов я слишком давно делал что-либо с питоном... Насколько я помню, если просто задекларировать переменную в модуле, а потом импортировать этот модуль, переменная будет видна.

#13 
  moose старожил04.10.18 21:11
NEW 04.10.18 21:11 
в ответ MrSanders 04.10.18 09:46, Последний раз изменено 04.10.18 21:14 (moose)

оказывается, даже если в класс обернуть, все равно будет торчать наружу:


“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.

немножко подразочаровывает : (


но я опробовал основные "механизмы", которые мне нужны, все отлично работает, и, уверен, код, который напишу, будет правильно работать. но хотелось бы где-нибудь отсмотреть выработанную "практику хорошего кодирования" на пайтоне, чтобы не изобретать велосипед и не наступать на грабли. где?


#14 
Simple Nothing is f*cked05.10.18 07:49
Simple
NEW 05.10.18 07:49 
в ответ moose 04.10.18 21:11
немножко подразочаровывает : (

Не понимаю, почему. В той же джаве концепция java bean с точки зрения ооп ущербная, хотя и нельзя достучаться до закрытого члена класса.

#15 
  moose старожил05.10.18 12:08
NEW 05.10.18 12:08 
в ответ Simple 05.10.18 07:49

я тоже пока не понимаю, почему. просто ожидал другого. это для меня как если бы в си объявление const отсутствовало (или компилятор его игнорировал), и просто существовало бы соглашение, что если вы не хотите, чтобы объект кто-то менял, начните его ид с чего-то там. и не меняйте такие объекты. просто давайте повыбрасываем все замки и договоримся, что никто не будет воровать или трогать что-то, на чем написано "мое" : )


я продолжу в этой ветке вопросы, не всегда касающиеся темы, возможно, этот вопрос следовало бы задать в разделе вэбхостинг, но там, похоже, заповедник, который редко посещается.

имеется сайт у провайдера, там в "корне" - index.html. я хочу каким-нибудь образом выполнить на сервере python-файл. думал (такой наивный!), вот сейчас переименую index.html -> index.html.bak, запишу туда index.py со строчкой print 'hello, world!', и, зайдя на сайт, увижу эту фразу. но вижу другое.

кто подскажет, как это правильно сделать? есть только ftp, для ssh нужно что-то дополнительно предпринять, хотелось бы обойтись насколько возможно. python у них установлен, я знаю где находится.

#16 
MrSanders старожил05.10.18 16:23
NEW 05.10.18 16:23 
в ответ moose 05.10.18 12:08

Никак, если у вас нет доступа к конфигурации веб-сервера. Это его надо настраивать чтобы он мог запускать питоновские скрипты.

#17 
  moose старожил05.10.18 16:37
NEW 05.10.18 16:37 
в ответ MrSanders 05.10.18 16:23, Последний раз изменено 05.10.18 16:39 (moose)

а я прочитал, что можно так:

помещаем в корень файл 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!!! отфильтровало часть тэгов. но смысл понятен, думаю.
#18 
  moose старожил05.10.18 18:00
NEW 05.10.18 18:00 
в ответ moose 05.10.18 16:37

ну вот, стоило только людям пожаловаться, как все решилось : ) "не стреляла потому что незаряженная была". почему-то дважды напечатал (как баден-баден : ), а нужно было

$command= escapeshellcmd('/usr/bin/python test0.py');

и не нужно ему 777, как все везде утверждают. в общем, кажется, все опробовано, можно начинать творить : )


#19 
MrSanders старожил06.10.18 02:07
NEW 06.10.18 02:07 
в ответ moose 05.10.18 18:00

да, сервер, запускающий из пыхыпы процессы это зашибись... Что ж это за провайдер такой, который disable_functions не использует?

Для поиграться такое решение вполне подойдёт.

#20 
  moose старожил06.10.18 12:46
NEW 06.10.18 12:46 
в ответ MrSanders 06.10.18 02:07

а почему вам это не нравится? читал, можно еще чрез cgi запустить, но не вижу, чем это лучше. еще читал, можно сделать что-то типа "интегрировать пайтон в пхп-скрипт", или что-то такое. ускорение происходит, т.к. интерпретатор пайтона активируется один раз при старте сервера, а не каждый раз при обращении к странице. но отладка будет геморройной: после каждой мелочи нужно перезапускать сервер.


у меня сейчас новый вопрос возник. вчера попробовал отправить из пайтона имэйл. получилось, но я должен в коде указать имя/пароль в открытом виде, что мне не нравится. понимаю, что это как поднять себя за волосы, но что можно придумать, не выкладывая пароль в открытом виде и не запрашивая его в интерактиве?

#21 
MrSanders старожил06.10.18 18:33
NEW 06.10.18 18:33 
в ответ moose 06.10.18 12:46
а почему вам это не нравится?

Дырка в безопасности.

читал, можно еще чрез cgi запустить, но не вижу, чем это лучше.

По скорости не сильно лучше. Просто контроль за тем, что запускается будет получше.

#22 
  moose старожил07.10.18 14:53
NEW 07.10.18 14:53 
в ответ MrSanders 06.10.18 18:33, Последний раз изменено 07.10.18 15:04 (moose)

я не специалист в дырках в безопасности, поэтому не понимаю, кто и как может эту дырку использовать. если бы вы могли "на пальцах" объяснить. только без "если кто-то получит 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__ напрямую, позволяет себя напечатать, а "то же самое" оказывается не совсем то же самое?

#23 
  moose старожил07.10.18 15:09
NEW 07.10.18 15:09 
в ответ moose 07.10.18 14:53, Последний раз изменено 08.10.18 09:47 (moose)

ну вот снова: стоило людям пожаловаться, как нашел простое объяснение:


https://stackoverflow.com/questions/1307014/python-str-ver...


... но все равно ничего не понимаю : (

почему print всегда использует acsii codec? как сделать так, чтобы он использовал другой?

#24 
AlexNek патриот08.10.18 00:57
AlexNek
NEW 08.10.18 00:57 
в ответ moose 06.10.18 12:46
но что можно придумать, не выкладывая пароль в открытом виде

Любой вид симметричного кодирования начиная от xor. Либо пользовать сервер не требующий пароля на посылку данных либо создать адрес для которого пароль не играет роли.

#25 
MrSanders старожил08.10.18 09:19
NEW 08.10.18 09:19 
в ответ moose 07.10.18 14:53
кто и как может эту дырку использовать.

Вы, как клиент провайдера. На своём собственном апаче можно и не запрещать пхп запускать процессы. Но если вы провайдер...

1. Вы не даёте клиенту SSH доступ. Благодаря процессам их php он его "получает".

2. Даже если у вашего клиента есть доступ по SSH. По ssh он логинится как vasja, с кучей ограничений и как бы вообще не в своем заchroot-енном окружении. А вот процессы запущенные апачевским php модулем будут бегать под апачевским пользователем. Вряд ли провайдер запускает апач под каждого клиента.

#26 
  moose старожил08.10.18 09:57
NEW 08.10.18 09:57 
в ответ MrSanders 08.10.18 09:19, Последний раз изменено 08.10.18 10:16 (moose)

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__()

#27 
  moose старожил08.10.18 10:01
NEW 08.10.18 10:01 
в ответ AlexNek 08.10.18 00:57

я уже сделал последнее. первое не понимаю как решит проблему (скорее усложнит), второе - такой сервер или не существует, или перестанет существовать в любой момент.

#28 
NightWatch коренной житель08.10.18 10:03
NightWatch
NEW 08.10.18 10:03 
в ответ moose 07.10.18 15:09, Последний раз изменено 08.10.18 10:09 (NightWatch)
почему 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)


#29 
  moose старожил08.10.18 10:25
NEW 08.10.18 10:25 
в ответ NightWatch 08.10.18 10:03

это все я вчера многократно прочитал. чего я не нашел, это как сделать так, чтобы print obj печатала символы, не являющиеся частью ascii. можете набросать работающий пример из нескольких строчек? класс возьмем такой:


class ClassA(object):
    def __init__(self):
        self.s = 'München'
я хочу, чтобы
...
cls = ClassA()
...
print cla
...
выдавало München.
#30 
  moose старожил08.10.18 10:49
NEW 08.10.18 10:49 
в ответ moose 08.10.18 10:25

прочел эту статью:


http://kmike.ru/python-with-strings-attached/


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

#31 
NightWatch коренной житель08.10.18 10:51
NightWatch
NEW 08.10.18 10:51 
в ответ moose 08.10.18 10:25

https://docs.python.org/2.7/reference/lexical_analysis.htm...

Проверь для начала, в какой кодировке у тебя сами скрипты, и соответствует ли ей декларация кодировки в заголовке скриптов.

#32 
  moose старожил08.10.18 11:45
NEW 08.10.18 11:45 
в ответ NightWatch 08.10.18 10:51

в моем случае кодировка скриптов до лампочки. "München" у меня не в скрипте, я его беру на стороне, это я для наглядности в примере его в скрипт вставил. факт тот, что print obj печатает результат, возвращаемый __str__ этого объекта, и предполагает, что там - строка ascii (и она ОБЯЗАНА возвращать именно это).

#33 
  moose старожил08.10.18 15:23
NEW 08.10.18 15:23 
в ответ moose 08.10.18 11:45

ладно, с этим разобрались. теперь решил загрузить на сервер mysql базу. прочитал, что это просто: делаешь дамп и импортируешь файл в phpmyadmin. c mysqldump все прошло быстро и красиво, а с импортом - сплошные неприятности. сперва он начал непонимать комментарии. повыбрасывал, ругается дальше. кто-нибудь делал подобные вещи? у них нечто mariadb. mysql-образное что-то.

#34 
1 2 все