Какую операционную систему использовать для разработки на Python?
Любую из распространенных. Python прекрасно адаптирован и под Linux и под Windows.
А с появление на Windows 10 подсистемы Ubuntu Linux Subsystem — вообще полная идентичность для утилит командной строки.
Подскажите стоит ли переходить на Linux, в чем плюсы минусы, какой дистрибутив выбрать, поделитесь опытом. Как Linux сочетается с другими языками программирования?
Linux нормально сочетается с языками программирования.
Кроме .NET — это вам к Windows
Кроме разработки под Apple — это вам к MacOSX
Для перехода я бы предложил самый допиленный под десктопное использование дистрибутив — Ubuntu Linux.
Правда целесообразность этого перехода мне представляется сомнительной.
Все равно среда Linux на сервере (администрирование через конфигурационные файлы) отличается от того, как вы будете администрировать свой личный комп (через GUI).
А для идентичной серверной среды следует использовать Vagrant, Docker, виртуальные машины — на любой операционной системе. Даже если вы работаете под Linux — их использование целесообразно для достижения полной идентичности серверной среде.
Из недостатков Linux — кривоватый графический интерфейс. Который не дотягивает ни до Window, ни до MacOSX. Но с этим можно мириться.
Из возможно вам не очевидных недостатков — запуск под Linux программ предназначенных для Windows будет или вообще невозможет, или совмещен с большими трудностями. То есть придется отказаться от любимых Windows-игр и от ряда программ, таких как Photoshop, например.
Всем привет изучаю питон совсем не давно, вопрос такой
, стоит ли переходить с windows на linux (говорят он более производительный) и с какими я могу столкнуться проблемами при дальнейшей работе на питоне ???
24
ответов
Не поиграть в игрушки, не запустить офис
Если с Linux ранее не сталкивались — не стоит. Продолжайте изучать Python
На винде? С отсутствием некоторых отдельных библиотек. Но есть wsl.
На линуксе? С любыми
Более производительный? Ну хз даже
Aleksey Freeman
Если с Linux ранее не сталкивались — не стоит. Про…
Для более комфортной работы — почему бы и да? Да, будет больно, но потом как поймет — будет замечательно)
Tishka17
На винде? С отсутствием некоторых отдельных библио…
я прям совсем не давно начал изучать питон и понятие не имею что такое wsl )
Serhii
Для более комфортной работы — почему бы и да? Да, …
Так комфортная работа начнётся когда Linux будет изучен. А пока не изучен — будет боль и унижение от Linux с Python =)
86202 Pavel
я прям совсем не давно начал изучать питон и поня…
Это к питону не относится, это виндовая штука
86202 Pavel
я прям совсем не давно начал изучать питон и поня…
Тула для запуска Linux-приложений в Windows
Aleksey Freeman
Так комфортная работа начнётся когда Linux будет и…
Изучение python для тех, кто не сталкивался с программированием раньше — тоже боль. А сверху ещё перейти на линух — так почему сразу не раздолбать себе пятую точку от попаболи чтобы было прям кайф потом?
Переходить не стоит, раз такой вопрос возник. Вот если понадобится, что-то, что потребует Линукс, то тогда и начнешь изучение. А сейчас где комфортнее там и изучай питон, хоть на маке.
прям существенная разница такая между видоус и линуксом?
Мне по ощущением да, тем более Линукс более интересен для изучения)
86202 Pavel
прям существенная разница такая между видоус и лин…
даже в коле
винда: 50млн строк
линукс: 12млн
Serhii
Мне по ощущением да, тем более Линукс более интере…
Я ноут откапал старый, и слышал что линукс быстрее работает, вот и думаю на фоне этого стоит ли там ставить линукс
86202 Pavel
прям существенная разница такая между видоус и лин…
В плане питона — нет, разве что какие-то библиотеки собирать проще будет. Но знания линукса скорее всего помогут, да и многие штуки на нем легче делаются.
86202 Pavel
Я ноут откапал старый, и слышал что линукс быстрее…
если для слабых, можешь поставить antix linux
86202 Pavel
Буду рад если разжуешь =)
для написания винды потрачено 50млн строк кода
в линуксе 12 млн строк кода
86202 Pavel
Буду рад если разжуешь =)
Где можно линукс скачать?
Челодой маловек
если для слабых, можешь поставить antix linux
Без сустемд новичку будет не прикольно
а что 🇷🇺
В плане питона — нет, разве что какие-то библиотек…
Т. Е. На линуксе больше возможностей для питона получается?
86202 Pavel
Т. Е. На линуксе больше возможностей для питона по…
Ну питон у тебя везде одинаково работать будет
Похожие вопросы
Обсуждают сегодня
Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia — бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как «хаки» и произвол. Короче говоря, с…
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это:
write_bit(buffer, 1);
write_bit(buffer, 0);
write_bit(buffer, 1);
write_bit(buffer, 1);
write_bit(buffer, 1);
w…
~
14
Добрый день!
Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью?
Можно написать динамический массив, можно связный …
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех «ибешни…
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76
15 лет назад…
Maksim Lapshin
20
Распознавание голоса и речи на C#
UnmanagedCoder 05.05.2025
Интеграция голосового управления в приложения на C# стала намного доступнее благодаря развитию специализированных библиотек и API. При этом многие разработчики до сих пор считают голосовое управление. . .
Реализация своих итераторов в C++
NullReferenced 05.05.2025
Итераторы в C++ — это абстракция, которая связывает весь экосистему Стандартной Библиотеки Шаблонов (STL) в единое целое, позволяя алгоритмам работать с разнородными структурами данных без знания их. . .
Разработка собственного фреймворка для тестирования в C#
UnmanagedCoder 04.05.2025
C# довольно богат готовыми решениями – NUnit, xUnit, MSTest уже давно стали своеобразными динозаврами индустрии. Однако, как и любой динозавр, они не всегда могут протиснуться в узкие коридоры. . .
Распределенная трассировка в Java с помощью OpenTelemetry
Javaican 04.05.2025
Микросервисная архитектура стала краеугольным камнем современной разработки, но вместе с ней пришла и головная боль, знакомая многим — отслеживание прохождения запросов через лабиринт взаимосвязанных. . .
Шаблоны обнаружения сервисов в Kubernetes
Mr. Docker 04.05.2025
Современные Kubernetes-инфраструктуры сталкиваются с серьёзными вызовами. Развертывание в нескольких регионах и облаках одновременно, необходимость обеспечения низкой задержки для глобально. . .
Создаем SPA на C# и Blazor
stackOverflow 04.05.2025
Мир веб-разработки за последние десять лет претерпел коллосальные изменения. Переход от традиционных многостраничных сайтов к одностраничным приложениям (Single Page Applications, SPA) — это. . .
Реализация шаблонов проектирования GoF на C++
NullReferenced 04.05.2025
«Банда четырёх» (Gang of Four или GoF) — Эрих Гамма, Ричард Хелм, Ральф Джонсон и Джон Влиссидес — в 1994 году сформировали канон шаблонов, который выдержал проверку временем. И хотя C++ претерпел. . .
C# и сети: Сокеты, gRPC и SignalR
UnmanagedCoder 04.05.2025
Сетевые технологии не стоят на месте, а вместе с ними эволюционируют и инструменты разработки. В . NET появилось множество решений — от низкоуровневых сокетов, позволяющих управлять каждым байтом. . .
Создание микросервисов с Domain-Driven Design
ArchitectMsa 04.05.2025
Архитектура микросервисов за последние годы превратилась в мощный архитектурный подход, который позволяет разрабатывать гибкие, масштабируемые и устойчивые системы. А если добавить сюда ещё и. . .
Многопоточность в C++: Современные техники C++26
bytestream 04.05.2025
C++ долго жил по принципу «один поток — одна задача» — как старательный солдатик, выполняющий команды одну за другой. В то время, когда процессоры уже обзавелись несколькими ядрами, этот подход стал. . .
Multiprocessing is an excellent package if you ever want to speed up your code without leaving Python. When I started working with multiprocessing, I was unaware of the differences between Windows and Linux, which set me back several weeks of development time on a relatively big project. Let’s quickly see how multiprocessing works and where Windows and Linux diverge.
The quickest way of showing how to use multiprocessing is to run a simple function without blocking the main program:
import multiprocessing as mp
from time import sleep
def simple_func():
print('Starting simple func')
sleep(1)
print('Finishing simple func')
if __name__ == '__main__':
p = mp.Process(target=simple_func)
p.start()
print('Waiting for simple func to end')
p.join()
Which outputs the following:
Waiting for simple func to end
Starting simple func
Finishing simple func
The output is what we were expecting. Let’s go to the core of the problem at hand by studying how this code behaves:
import multiprocessing as mp
from time import sleep
print('Before defining simple_func')
def simple_func():
print('Starting simple func')
sleep(1)
print('Finishing simple func')
if __name__ == '__main__':
p = mp.Process(target=simple_func)
p.start()
print('Waiting for simple func to end')
p.join()
If we run this code on Windows, we get the following output:
Before defining simple_func
Waiting for simple func to end
Before defining simple_func
Starting simple func
Finishing simple func
While on Linux we get the following output:
Before defining simple_func
Waiting for simple func to end
Starting simple func
Finishing simple func
It does not look like much, except for the second Before defining simple_func
, and this difference is crucial. On Linux, when you start a child process, it is Forked. It means that the child process inherits the memory state of the parent process. On Windows (and by default on Mac), however, processes are Spawned. It means that a new interpreter starts and the code reruns.
It explains why, if we run the code on Windows, we get twice the line Before defining simple_func
. As you may have noticed, this could have been much worse if we wouldn’t include the if __main__
at the end of the file, let’s check it out. On Windows, it produces a very long error, that finishes with:
RuntimeError:
An attempt has been made to start a new process before the
current process has finished its bootstrapping phase.
This probably means that you are not using fork to start your
child processes and you have forgotten to use the proper idiom
in the main module:
if __name__ == '__main__':
freeze_support()
...
The "freeze_support()" line can be omitted if the program
is not going to be frozen to produce an executable.
While on Linux, it works just fine. It may not look like much, but imagine you have some computationally expensive initialization task. Perhaps you do some system checks when the program runs. Probably you don’t want to run all those checks for every process you start. It can get even more interesting if you have values that change at runtime:
import multiprocessing as mp
import random
val = random.random()
def simple_func():
print(val)
if __name__ == '__main__':
print('Before multiprocessing: ')
simple_func()
print('After multiprocessing:')
p = mp.Process(target=simple_func)
p.start()
p.join()
On Windows, it would give an output like this:
Before multiprocessing:
0.16042209710776734
After multiprocessing:
0.9180213870647225
While on Linux, it gives an output like this:
Before multiprocessing:
0.28832424513226507
After multiprocessing:
0.28832424513226507
And this brings us to the last topic and the reason why I lost so much time when I had to port code written in Linux to work on Windows. A typical situation in which values change at runtime is when you are working with classes. Objects are meant to hold values; they are not static. So, what happens if you try to run a method of a class on a separate process? Let’s start with a straightforward task:
import multiprocessing as mp
class MyClass:
def __init__(self, i):
self.i = i
def simple_method(self):
print('This is a simple method')
print(f'The stored value is: {self.i}')
def mp_simple_method(self):
self.p = mp.Process(target=self.simple_method)
self.p.start()
def wait(self):
self.p.join()
if __name__ == '__main__':
my_class = MyClass(1)
my_class.mp_simple_method()
my_class.wait()
The code works fine both on Linux and Windows. And this may happen for a lot of different scenarios, until one day you try to do something slightly more complicated, like writing or reading from a file:
import multiprocessing as mp
class MyClass:
def __init__(self, i):
self.i = i
self.file = open(f'{i}.txt', 'w')
def simple_method(self):
print('This is a simple method')
print(f'The stored value is: {self.i}')
def mp_simple_method(self):
self.p = mp.Process(target=self.simple_method)
self.p.start()
def wait(self):
self.p.join()
self.file.close()
if __name__ == '__main__':
my_class = MyClass(1)
my_class.mp_simple_method()
my_class.wait()
On Linux, the code above works fine. On Windows (and Mac), however, there’ll be a very nasty error:
[...]
ForkingPickler(file, protocol).dump(obj)
TypeError: cannot serialize '_io.TextIOWrapper' object
Pay attention to the fact that we don’t do anything with the file. We just open and store it as an attribute in the class. However, the error already points to an interesting feature. The way Spawning works is by pickling the entire object. Therefore, if we have a class or an attribute that is not pickable, we will not be able to start a child process with it.
And, for people working with hardware, most likely the communication with the device, in pretty much the same way that a file is non-pickable. It does not matter how much you try to make it multiprocessing safe by implementing locks or whatnot. The root problem is at a lower level.
Is there a way of solving it?
Sadly, there is no way of changing how processes start on Windows. You can, on the other hand, change how processes start on Linux. It would allow you to be sure your program also runs on Windows and Mac. We just need to add the following:
if __name__ == '__main__':
mp.set_start_method('spawn')
my_class = MyClass(1)
my_class.mp_simple_method()
my_class.wait()
By using set_start_method
, the program will give the same error on Windows and Linux. Whether you need to add this line or not depends on what do you want to achieve.
So, if you ever encounter these discrepancies, you will have to re-think the design of your program. I had objects with non-pickable attributes, especially drivers for devices and ZMQ sockets.
Speed is another factor
Even though processes usually speed up the speed of a program by leveraging multiple cores on a computer, starting each process can be time-consuming. The fact that on Windows and Mac Python needs to pickle the objects to create child processes adds an overhead that may offset the benefits of running on separated processes. It is especially relevant when you have many small tasks to perform, instead of a couple of long-running ones.
Therefore, when using processes, improving the speed of the program is not a granted outcome. You should always benchmark your application to understand where and how different components can affect its behavior.