Как изменить местоположение python

In this tutorial, you'll learn about how to add Python, or any other program, to your PATH environment variable. You'll be covering the procedure in Windows, macOS, and Linux and find out what PATH is and why it's important.

You may need to add Python to PATH if you’ve installed Python, but typing python on the command line doesn’t seem to work. You may be getting a message saying that the term python isn’t recognized, or you may end up with the wrong version of Python running.

A common fix for these problems is adding Python to the PATH environment variable. In this tutorial, you’ll learn how to add Python to PATH. You’ll also learn about what PATH is and why PATH is vital for programs like the command line to be able to find your Python installation.

The steps that you’ll need to take to add something to PATH will depend significantly on your operating system (OS), so be sure to skip to the relevant section if you’re only interested in this procedure for one OS.

Note that you can use the following steps to add any program to PATH, not just Python.

How to Add Python to PATH on Windows

The first step is to locate the directory in which your target Python executable lives. The path to the directory is what you’ll be adding to the PATH environment variable.

To find the Python executable, you’ll need to look for a file called python.exe. The Python executable could be in a directory in C:Python or in your AppData folder, for instance. If the executable were in AppData, then the path would typically look something like this:

C:Users<USER>AppDataLocalProgramsPython

In your case, the <USER> part would be replaced by your currently logged-in user name.

Once you’ve found the executable, make sure it works by double-clicking it and verifying that it starts up a Python REPL in a new window.

If you’re struggling to find the right executable, you can use Windows Explorer’s search feature. The issue with the built-in search is that it’s painfully slow. To perform a super-fast full system search for any file, a great alternative is Everything:

A screenshot of the Everything program searching for "python.exe"

Those paths highlighted in yellow, namely those at WindowsApps and Python310, would be ideal candidates to add to PATH because they look like executables at the root level of an installation. Those highlighted in red wouldn’t be suitable because some are part of a virtual environment—you can see venv in the path—and some are shortcuts or internal Windows installations.

You may also encounter Python executables that are installed within the folder for a different program. This is due to the fact that many applications bundle their own version of Python within them. These bundled Python installations would also be unsuitable.

Once you’ve located your Python executable, open the Start menu and search for the Edit the system environment variables entry, which opens up a System Properties window. In the Advanced tab, click on the button Environment Variables. There you’ll see User and System variables, which you’ll be able to edit:

In the section entitled User Variables, double-click on the entry that says Path. Another window will pop up showing a list of paths. Click the New button and paste the path to your Python executable there. Once that’s inserted, select your newly added path and click the Move Up button until it’s at the top.

That’s it! You may need to reboot your computer for the changes to take effect, but you should now be able to call python from the command line.

For setting the PATH environment variable from the command line, check out the section on Configuring Environment Variables in the Windows Python coding setup guide. You can also find instructions in the supplemental materials:

You may also want to set up PATH on your Linux or macOS machine, or perhaps you’re using Windows Subsystem for Linux (WSL). If so, read the next section for the procedure on UNIX-based systems.

How to Add Python to PATH on Linux and macOS

Since Python typically comes pre-installed on UNIX-based systems, the most common problem on Linux and macOS is for the wrong python to run, rather than not finding any python. That said, in this section, you’ll be troubleshooting not being able to run python at all.

The first step is locating your target Python executable. It should be a program that you can run by first navigating to the containing directory and then typing ./python on the command line.

You need to prepend the call to the Python executable with its relative path in the current folder (./) because otherwise you’ll invoke whichever Python is currently recorded on your PATH. As you learned earlier, this might not be the Python interpreter that you want to run.

Often the Python executable can be found in the /bin/ folder. But if Python is already in the /bin/ folder, then it’s most likely already on PATH because /bin/ is automatically added by the system. If this is the case, then you may want to skip to the section on the order of paths within PATH.

Since you’re probably here because you’ve installed Python but it’s still not being found when you type python on the command line, though, you’ll want to search for it in another location.

That said, it might be that /bin/ has been removed from PATH altogether, in which case you might skip forward to the section on mangaging PATH.

Once you’ve located your Python executable and are sure it’s working, take note of the path for later. Now it’s time to start the process of adding it to your PATH environment variable.

First, you’ll want to navigate to your home folder to check out what configuration scripts you have available:

You should see a bunch of configuration files that begin with a period (.). These are colloquially known as dotfiles and are hidden from ls by default.

One or two dotfiles get executed whenever you log in to your system, another one or two run whenever you start a new command-line session, and most others are used by other applications for configuration settings.

You’re looking for the files that run when you start your system or a new command-line session. They’ll probably have names similar to these:

  • .profile
  • .bash_profile
  • .bash_login
  • .zprofile
  • .zlogin

The keywords to look for are profile and login. You should, in theory, only have one of these, but if you have more than one, you may need to read the comments in them to figure out which ones run on login. For example, .profile file on Ubuntu will typically have the following comment:

# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.

So, if you have .profile but also .bash_profile, then you’ll want to use .bash_profile.

You can also use a .bashrc or .zshrc file, which are scripts that run whenever you start a new command-line session. Run command (rc) files are common places to put PATH configurations.

To add the Python path to the beginning of your PATH environment variable, you’re going to be executing a single command on the command line.

Use the following line, replacing <PATH_TO_PYTHON> with your actual path to the Python executable, and replace .profile with the login script for your system:

$ echo export PATH="<PATH_TO_PYTHON>:$PATH" >> ~/.profile

This command adds export PATH="<PATH_TO_PYTHON>:$PATH" to the end of .profile. The command export PATH="<PATH_TO_PYTHON>:$PATH" prepends <PATH_TO_PYTHON> to the PATH environment variable. It’s similar to the following operation in Python:

>>>

>>> PATH = "/home/realpython/apps:/bin"
>>> PATH = f"/home/realpython/python:{PATH}"
>>> PATH
'/home/realpython/python:/home/realpython/apps:/bin'

Since PATH is just a string separated by colons, prepending a value involves creating a string with the new path, a colon, then the old path. With this string, you set the new value of PATH.

To refresh your current command-line session, you can run the following command, replacing .profile with whichever login script you’ve chosen:

Now, you should be able to call python from the command line directly. The next time you log in, Python should automatically be added to PATH.

If you’re thinking this process seems a bit opaque, you’re not alone! Read on for more of a deep dive into what’s going on.

Understanding What PATH Is

PATH is an environment variable that contains a list of paths to folders. Each path in PATH is separated by a colon or a semicolon—a colon for UNIX-based systems and a semicolon for Windows. It’s like a Python variable with a long string as its value. The difference is that PATH is a variable accessible by almost all programs.

Programs like the command line use the PATH environment variable to find executables. For example, whenever you type the name of a program into the command line, the command line will search various places for the program. One of the places that the command line searches is PATH.

All the paths in PATH need to be directories—they shouldn’t be files or executables directly. Programs that use PATH take each directory in turn and search all the files within it. Subdirectories within directories in PATH don’t get searched, though. So it’s no good just adding your root path to PATH!

It’s also important to note that programs that use PATH typically don’t search for anything except executables. So, you can’t use PATH as a way to define shortcuts to commonly used files.

Understanding the Importance of Order Within PATH

If you type python into the command line, the command line will look in each folder in the PATH environment variable for a python executable. Once it finds one, it’ll stop searching. This is why you prepend the path to your Python executable to PATH. Having the newly added path first ensures that your system will find this Python executable.

A common issue is having a failed Python installation on your PATH. If the corrupted executable is the first one that the command line comes across, then the command line will try and run that and then abort any further searching. The quick fix for this is just adding your new Python directory before the old Python directory, though you’d probably want to clean your system of the bad Python installation too.

Reordering PATH on Windows is relatively straightforward. You open the GUI control panel and adjust the order using the Move Up and Move Down buttons. If you’re on a UNIX-based operating system, however, the process is more involved. Read on to learn more.

Managing Your PATH on UNIX-based Systems

Usually, your first task when managing your PATH is to see what’s in there. To see the value of any environment variable in Linux or macOS, you can use the echo command:

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/home/realpython/badpython:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

Note that the $ symbol is used to tell the command line that the following identifier is a variable. The issue with this command is that it just dumps all the paths on one line, separated by colons. So you might want to take advantage of the tr command to translate colons into newlines:

$ echo $PATH | tr ":" "n"
/usr/local/sbin
/usr/local/bin
/usr/sbin
/home/realpython/badpython
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games

In this example, you can see that badpython is present in PATH. The ideal course of action would be to perform some PATH archaeology and figure out where it gets added to PATH, but for now, you just want to remove it by adding something to your login script .

Since PATH is a shell string, you don’t have access to convenient methods to remove parts of it, like you would if it were a Python list. That said, you can pipe together a few shell commands to achieve something similar:

export PATH=`echo $PATH | tr ":" "n" | grep -v 'badpython' | tr "n" ":"`

This command takes the list from the previous command and feeds it into grep, which, together with the -v switch, will filter out any lines containing the substring badpython. Then you can translate the newlines back to colons, and you have a new and valid PATH string that you use right away to replace your old PATH string.

Though this can be a handy command, the ideal solution would be to figure out where that bad path gets added. You could try looking at other login scripts or examine specific files in /etc/. In Ubuntu, for instance, there’s a file called environment, which typically defines a starting path for the system. In macOS, that might be /etc/paths. There can also be profile files and folders in /etc/ that might contain startup scripts.

The main difference between configurations in /etc/ and in your home folder is that what’s in /etc/ is system-wide, while whatever’s in your home folder will be scoped to your user.

It can often involve a bit of archeology to track down where something gets added to your PATH, though. So, you may want to add a line in your login or rc script that filters out certain entries from PATH as a quick fix.

Conclusion

In this tutorial, you’ve learned how to add Python, or any other program, to your PATH environment variable on Windows, Linux, and macOS. You also learned a bit more about what PATH is and why its internal order is vital to consider. Finally, you also discovered how you might manage your PATH on a UNIX-based system, seeing as it’s more complex than managing your PATH on Windows.

I have installed Python 3.6.2 Windows in

c:usersusernameAppDataLocalprogramsPythonPython36

(because that is the (totally stupid) default.

I have manually moved that into c:

But the update to Python 3.6.3 still installs to the original target.

How do I change this (without uninstalling (which would also uninstall all packages))?

bigbounty's user avatar

bigbounty

16k4 gold badges35 silver badges61 bronze badges

asked Oct 4, 2017 at 8:28

Ruediger Jungbeck's user avatar

2

I am not sure this will be the best answer though the simplest thing to do if you are stuck you could try this.

You could move you installation back to its original location, then update it.
Then once complete move it to where you want.


Alternatively, there is a registry value that shows Python installation path. I would check to see if this reflects your new path, if not then updating it may allow your update to work. The location of the registry on my machine is:

ComputerHKEY_CURRENT_USERSOFTWAREPythonPythonCore3.6InstallPath

Bugs's user avatar

Bugs

4,4919 gold badges32 silver badges41 bronze badges

answered Oct 4, 2017 at 8:40

CodeCupboard's user avatar

CodeCupboardCodeCupboard

1,4872 gold badges17 silver badges26 bronze badges

3

If you installed Python for all users, the registry path (64bit Python on 64bit OS) would be:

  • HKEY_LOCAL_MACHINESOFTWAREPythonPythonCore3.8Idle
  • HKEY_LOCAL_MACHINESOFTWAREPythonPythonCore3.8InstallPath
  • HKEY_LOCAL_MACHINESOFTWAREPythonPythonCore3.8PythonPath
  • HKEY_LOCAL_MACHINESOFTWAREPythonPythonCore3.8HelpMain Python
    Documentation
  • HKEY_CLASSES_ROOTPython.FileShelleditwithidleshelledit38command
  • HKEY_CLASSES_ROOTPython.NoConFileShelleditwithidleshelledit38command

answered Jan 2, 2021 at 21:41

Unreal Qw's user avatar

1

Most likely, the problem is that you didn’t change the environment PATH in your windows settings. If you modify the path to c:Python36 folder everything should be back to norm.

Here are instructions how to do this Modify environment PATH on Windows

answered Oct 4, 2017 at 8:43

Dmytro Chasovskyi's user avatar

3

I had faced similar problem. For some reason I wanted to change the PC admin but my Python was installed on the old user directory.
All updates and repairs I had to do on the same directory.

Then I deleted the python path from registry (Since I wanted to have fresh install later):
ComputerHKEY_CURRENT_USERSOFTWAREPython
and then reinstalled python.

PS: While installing on your home PC its better to install across users. My python is installed at below location:
C:Program FilesPython37

answered Jun 1, 2019 at 17:55

Zeeshan Shaikh's user avatar

I have installed Python 3.6.2 Windows in

c:usersusernameAppDataLocalprogramsPythonPython36

(because that is the (totally stupid) default.

I have manually moved that into c:

But the update to Python 3.6.3 still installs to the original target.

How do I change this (without uninstalling (which would also uninstall all packages))?

bigbounty's user avatar

bigbounty

16k4 gold badges35 silver badges61 bronze badges

asked Oct 4, 2017 at 8:28

Ruediger Jungbeck's user avatar

2

I am not sure this will be the best answer though the simplest thing to do if you are stuck you could try this.

You could move you installation back to its original location, then update it.
Then once complete move it to where you want.


Alternatively, there is a registry value that shows Python installation path. I would check to see if this reflects your new path, if not then updating it may allow your update to work. The location of the registry on my machine is:

ComputerHKEY_CURRENT_USERSOFTWAREPythonPythonCore3.6InstallPath

Bugs's user avatar

Bugs

4,4919 gold badges32 silver badges41 bronze badges

answered Oct 4, 2017 at 8:40

CodeCupboard's user avatar

CodeCupboardCodeCupboard

1,4872 gold badges17 silver badges26 bronze badges

3

If you installed Python for all users, the registry path (64bit Python on 64bit OS) would be:

  • HKEY_LOCAL_MACHINESOFTWAREPythonPythonCore3.8Idle
  • HKEY_LOCAL_MACHINESOFTWAREPythonPythonCore3.8InstallPath
  • HKEY_LOCAL_MACHINESOFTWAREPythonPythonCore3.8PythonPath
  • HKEY_LOCAL_MACHINESOFTWAREPythonPythonCore3.8HelpMain Python
    Documentation
  • HKEY_CLASSES_ROOTPython.FileShelleditwithidleshelledit38command
  • HKEY_CLASSES_ROOTPython.NoConFileShelleditwithidleshelledit38command

answered Jan 2, 2021 at 21:41

Unreal Qw's user avatar

1

Most likely, the problem is that you didn’t change the environment PATH in your windows settings. If you modify the path to c:Python36 folder everything should be back to norm.

Here are instructions how to do this Modify environment PATH on Windows

answered Oct 4, 2017 at 8:43

Dmytro Chasovskyi's user avatar

3

I had faced similar problem. For some reason I wanted to change the PC admin but my Python was installed on the old user directory.
All updates and repairs I had to do on the same directory.

Then I deleted the python path from registry (Since I wanted to have fresh install later):
ComputerHKEY_CURRENT_USERSOFTWAREPython
and then reinstalled python.

PS: While installing on your home PC its better to install across users. My python is installed at below location:
C:Program FilesPython37

answered Jun 1, 2019 at 17:55

Zeeshan Shaikh's user avatar

The goal: get the aws command from the awscli package to a custom directory, namely /home/transang/my-python-packages.

Initially, everything was simple. But latterly it got complicated as many bugs appeared.

I will introduce the bugs one by one before coming up with a stable solution for this use case.

If you arrive here to know the post title’s solution, I highly recommend reading from the end of the post.


Environments

There are 3 PC, called PC1, PC2, PC3

In PC1:

$ python3 --version               
Python 3.6.9
$ pip3 --version                  
pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)
l%                                                                                                                                             $ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.3 LTS
Release:	18.04
Codename:	bionic

In PC2:

ubuntu@ip-10-0-102-219:~$ python3 --version
Python 3.6.9
ubuntu@ip-10-0-102-219:~$ pip3 --version
lsb_pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)
ubuntu@ip-10-0-102-219:~$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.1 LTS
Release:	18.04
Codename:	bionic

In PC3:

piproot@vultr:~# python3 --version
Python 3.7.3
root@vultr:~# pip3 --version
lsb_repip 18.1 from /usr/lib/python3/dist-packages/pip (python 3.7)
root@vultr:~# lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 19.04
Release:	19.04
Codename:	disco

PC1 and PC2 introduce bugs while the first solution works perfectly in PC3.


Initial solution

Very simple with the --target option

pip3 install --target=/home/transang/my-python-packages awscli

The command successfully finished in the PC3. Yet the PC1 and PC2. There was the following error

Exception:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/usr/lib/python3/dist-packages/pip/commands/install.py", line 360, in run
    prefix=options.prefix_path,
  File "/usr/lib/python3/dist-packages/pip/req/req_set.py", line 784, in install
    **kwargs
  File "/usr/lib/python3/dist-packages/pip/req/req_install.py", line 851, in install
    self.move_wheel_files(self.source_dir, root=root, prefix=prefix)
  File "/usr/lib/python3/dist-packages/pip/req/req_install.py", line 1064, in move_wheel_files
    isolated=self.isolated,
  File "/usr/lib/python3/dist-packages/pip/wheel.py", line 247, in move_wheel_files
    prefix=prefix,
  File "/usr/lib/python3/dist-packages/pip/locations.py", line 153, in distutils_scheme
    i.finalize_options()
  File "/usr/lib/python3.6/distutils/command/install.py", line 274, in finalize_options
    raise DistutilsOptionError("can't combine user with prefix, "
distutils.errors.DistutilsOptionError: can't combine user with prefix, exec_prefix/home, or install_(plat)base

I found the bug report here. I needed to specify --system option to prevent the default --user option.


Second step solution

After adding the --system option

pip3 install --system --target=/home/transang/my-python-packages awscli

The command successfully ended in all PCs.

However, another bug was introduced. In the PC3, there is binary installed in /home/transang/my-python-packages. Yet the PC1, PC2.

I again discovered the solution from here. With the new solution, I came up with the next solution


The currently stable solution

Adding --install-option solves the problem introduced previously.

pip3 install --system --target=/home/transang/my-python-packages --install-option=--install-scripts=/home/transang/my-python-packages/bin awscli

Now, the binary appears in all PCs in /home/transang/my-python-packages/bin directory.


The story does not end yet

I wonder about the stability of python’s package management. Compared to npm, yarn of nodejs, there are too many errors for even a straightforward operation.

When I ran the above solution in Mac, python 3.8.1, pip3 20.0.2, it complains no such option: --system.

Removing the --system flag makes the command work. However, it throws another warning

DEPRECATION: Location-changing options found in --install-option: ['--install-scripts'] from command line. This configuration may cause unexpected behavior and is unsupported. pip 20.2 will remove support for this functionality. A possible replacement is using pip-level options like --user, --prefix, --root, and --target. You can find discussion regarding this at https://github.com/pypa/pip/issues/7309.

The deprecation warning links to this github issue. It looks like the pip maintainers are going to remove the --install-option flag. This issue is relatively new and is on the TODO list at the time of writing this blog.

After ignoring the warning and finished the installation, I tried to run the installed package. Another error was thrown

Traceback (most recent call last):
  File "/Users/transang/python/packages-bin/aws", line 19, in <module>
    import awscli.clidriver
ModuleNotFoundError: No module named 'awscli'

Actually, installing the package by this way in my Mac is just optional. So I temporarily installed the package directly to the root directory of python. I will come back and continue this part later.


Now, the most stable version

  • Upgrade pip. The following command also specifies a custom location for the pip package
PYTHONUSERBASE=/home/transang/my-site-packages python3 -m pip install --user --upgrade pip
  • Check pip version
PYTHONUSERBASE=/home/transang/my-site-packages python3 -m pip --version

It should show the installed latest version of pip (current is 20.0.2 with the customized package location)

  • Install awscli
PYTHONUSERBASE=/home/transang/my-site-packages python3 -m pip install --upgrade --target /home/transang/my-python-packages awscli
  • Invoke the installed package
PYTHONPATH=/home/transang/my-python-packages /home/transang/my-python-packages/bin/aws --version

Happy coding!

Python

Вы читаете эту статью, потому что пользуетесь:

Skillfactory.ru

  1. Windows 10+
  2. Python 3.3+
  3. Anaconda3

… и хотите изменить PYTHONPATH.

Краткая инструкция

  1. Откройте C:Users<your_username>Anaconda3Libsite-packages
  2. Создайте файл python37.pth
  3. Измените файл и добавьте в него строку C:Users<your_username>my_module

Подробное объяснение

Пролог

В большинстве случаев достаточно изменения PYTHONPATH из GUI настроек. Почему так — подробно объясняется на Stack Overflow.

Небольшое пояснение по п.1

Если у вас нет C:Users<your_username>Anaconda3Libsite-packages, то замените C:Users<your_username> на путь к Anaconda 3.

Skillfactory.ru

Небольшое пояснение по п.2

Если вы работаете в Python 3.7, то создайте файл под названием python37.pth. Для остальных версий создавайте файл python<XX>.pth.

  • Не знаете, в какой версии работаете? 
    Поищите похожий на python<XX>.dll файл вот здесь: C:Users<your_username>Anaconda3. Название версии указано в <XX>. Его нужно присвоить файлу.pth.
  • Windows действует на нервы и не дает создать файл с расширением.pth
    Такие файлы есть в папке C:Users<your_username>Anaconda3Lib site-packages. Скопируйте один из этих файлов и измените его расширение.
  • Прочитали где-то, что лучше создавать ._pth, а не .pth?
    Файл ._pth полностью заменяет существующий путь. А .pth добавляет свое содержимое к уже существующему пути. Более подробно объясняется здесь.

Небольшое пояснение по п.3

Предположим, что SuperCoolClass, который вы хотите импортировать, находится в C:Users<your_username>my_project_folder my_awesome_file.py.

Тогда откройте недавно созданный файл python<XX>.pth в своем любимом текстовом редакторе (пожалуйста, не говорите, что это Vim!) и добавьте туда вот эту строку:C:Users<your_username>my_project_folder.
Да-да, с этими раздражающими двойными слешами  .
И да, без кавычек “” .

Вот и все.
Теперь вы, как любой нормальный человек, сможете импортировать файлы, откуда угодно:
from my_awesome_file import SuperCoolClass .

Эпилог

Добавлять здесь особо нечего. Надеюсь, 2 часа нервотрепки и час на написание статьи сэкономят ваше время. Удачи.

— Что мы говорим ошибке импорта? — Не сегодня

Читайте также:

  • Овладей Python, создавая реальные приложения. Часть 1
  • Понятие о виртуальных средах в Python
  • Python для анализа данных: 8 концепций, о которых вы могли забыть

Перевод статьи Dalya Gartzman: How to edit PYTHONPATH on Windows

  1. 1. Настройка локальной среды
  2. 2. Получение Python
    1. 1. Платформа Windows
    2. 2. Платформа Linux
    3. 3. Mac OS
  3. 3. Настройка PATH
    1. 1. Настройка PATH в Unix / Linux
    2. 2. Настройка PATH в Windows
    3. 3. Переменные среды Python
    4. 4. Запуск Python
      1. 1. Интерактивный интерпретатор
      2. 2. Скрипт из командной строки
      3. 3. Интегрированная среда разработки

Python 3 доступен для Windows, Mac OS и большинства вариантов операционной системы Linux.

Настройка локальной среды

Откройте окно терминала и введите «python», чтобы узнать, установлен ли он и какая версия установлена.

Получение Python

Платформа Windows

Бинарники последней версии Python 3 (Python 3.6.4) доступны на этой странице

загрузки

Доступны следующие варианты установки.

  • Windows x86-64 embeddable zip file
  • Windows x86-64 executable installer
  • Windows x86-64 web-based installer
  • Windows x86 embeddable zip file
  • Windows x86 executable installer
  • Windows x86 web-based installer

Примечание. Для установки Python 3.6.4 минимальными требованиями к ОС являются Windows 7 с пакетом обновления 1 (SP1). Для версий от 3.0 до 3.4.x Windows XP является приемлемым.


Платформа Linux

Различные варианты использования Linux используют разные менеджеры пакетов для установки новых пакетов.

На Ubuntu Linux Python 3 устанавливается с помощью следующей команды из терминала.

sudo apt-get install python3-minimal

Установка из исходников

Загрузите исходный tar-файл Gzipped с URL-адреса загрузки Python

https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz

Extract the tarball
tar xvfz Python-3.5.1.tgz
Configure and Install:
cd Python-3.5.1
./configure --prefix = /opt/python3.5.1
make  
sudo make install

Mac OS

Загрузите установщики Mac OS с этого URL-адреса

https://www.python.org/downloads/mac-osx/

Дважды щелкните этот файл пакета и следуйте инструкциям мастера для установки.

Самый современный и текущий исходный код, двоичные файлы, документация, новости и т.д. Доступны на официальном сайте Python —


Python Official Website

https://www.python.org/

Вы можете загрузить документацию Python со следующего сайта. Документация доступна в форматах HTML, PDF и PostScript.


Python Documentation Website

www.python.org/doc/

Настройка PATH

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

Важными особенностями являются:

  • Путь хранится в переменной среды, которая является именованной строкой, поддерживаемой операционной системой. Эта переменная содержит информацию, доступную для командной оболочки и других программ.
  • Переменная пути называется PATH в Unix или Path в Windows (Unix чувствительна к регистру, Windows — нет).
  • В Mac OS установщик обрабатывает детали пути. Чтобы вызвать интерпретатор Python из любого конкретного каталога, вы должны добавить каталог Python на свой путь.

Настройка PATH в Unix / Linux

Чтобы добавить каталог Python в путь для определенного сеанса в Unix —


  • В csh shell

    — введите setenv PATH «$ PATH:/usr/local/bin/python3» и нажмите Enter.

  • В оболочке bash (Linux)

    — введите PYTHONPATH=/usr/local/bin/python3.4 и нажмите Enter.

  • В оболочке sh или ksh

    — введите PATH = «$PATH:/usr/local/bin/python3» и нажмите Enter.

Примечание.

/usr/local/bin/python3

— это путь к каталогу Python.

Настройка PATH в Windows

Чтобы добавить каталог Python в путь для определенного сеанса в Windows —

  • В командной строке введите путь

    %path%;C:Python

    и нажмите Enter.

Примечание.

C:Python

— это путь к каталогу Python.

Переменные среды Python

S.No. Переменная и описание
1
PYTHONPATH

Он играет роль, подобную PATH. Эта переменная сообщает интерпретатору Python, где можно найти файлы модулей, импортированные в программу. Он должен включать каталог исходной библиотеки Python и каталоги, содержащие исходный код Python. PYTHONPATH иногда задается установщиком Python.
2
PYTHONSTARTUP

Он содержит путь к файлу инициализации, содержащему исходный код Python. Он выполняется каждый раз, когда вы запускаете интерпретатор. Он называется как .pythonrc.py в Unix и содержит команды, которые загружают утилиты или изменяют PYTHONPATH.
3
PYTHONCASEOK

Он используется в Windows, чтобы проинструктировать Python о поиске первого нечувствительного к регистру совпадения в инструкции импорта. Установите эту переменную на любое значение, чтобы ее активировать.
4
PYTHONHOME

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

Запуск Python

Существует три разных способа запуска Python —

Интерактивный интерпретатор

Вы можете запустить Python из Unix, DOS или любой другой системы, которая предоставляет вам интерпретатор командной строки или окно оболочки.

Введите

python

в командной строке.

Начните кодирование сразу в интерактивном интерпретаторе.

$python             # Unix/Linux
or 
python%             # Unix/Linux
or 
C:>python           # Windows/DOS

Вот список всех доступных параметров командной строки —

S.No. Вариант и описание
1
-d

предоставлять отладочную информацию
2
-O

генерировать оптимизированный байт-код (приводящий к .pyo-файлам)
3
-S

не запускайте сайт импорта, чтобы искать пути Python при запуске
4
-v

подробный вывод (подробная трассировка по операциям импорта)
5
-X

отключить встроенные исключения на основе классов (просто используйте строки); устаревший, начиная с версии 1.6
6
-c cmd

запустить скрипт Python, отправленный в виде строки cmd
7
file

запустить скрипт Python из заданного файла

Скрипт из командной строки

Сценарий Python можно запустить в командной строке, вызвав интерпретатор в вашем приложении, как показано в следующем примере.

$python  script.py          # Unix/Linux
or 
python% script.py           # Unix/Linux
or 
C:>python script.py         # Windows/DOS

Примечание. Убедитесь, что права файлов разрешают выполнение.

Интегрированная среда разработки

Вы можете запустить Python из среды графического интерфейса пользователя (GUI), если у вас есть приложение GUI в вашей системе, которое поддерживает Python.

Для разработки Python приложений рекомендую PyCharm от компании JetBrains, как наиболее развитую и удобную IDE.

Сегодня мы поговорим о том, как импортировать пакеты и модули в Python (а заодно и о разнице между ними). К концу руководства вы получите структуру каталогов (для проекта Medium_Imports_Tutorial), где будет удобно импортировать любые скрипты из одного подкаталога в другой (стрелки синего цвета на картинке ниже).

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

Итак, наша структура каталогов для изучения импорта в Python будет выглядеть следующим образом:

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

  • Модуль — один скрипт Python.
  • Пакет — набор модулей.

Вот и вся разница! Просто, не правда ли?

Что ж, теперь давайте начинать!

[python_ad_block]

Импорт в рамках одного каталога

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

Для простоты давайте сначала создадим один каталог scripts в каталоге нашего проекта и добавим в него два модуля — example1.py и example2.py. Наша структура будет выглядеть так:

Идея состоит в том, чтобы любая функция/переменная/класс, определенные в example1.py, были доступны в example2.py. Содержимое у нас будет таким:

#example1.py
MY_EX1_STRING = 'Welcome to Example1 module!'
def yolo(x: int):
     print("You only LIve", x, "times.")

Чтобы импортировать эти элементы в example2.py, сделаем следующее:

#example2.py
import example1
# imported string
print("The imported string is: ", example1.MY_EX1_STRING)
# imported function
example1.yolo(10)

Как видно, доступ к элементам в импортированном модуле можно получить с помощью записи через точку — например, example1.yolo() или example1.MY_EX1_STRING. Если вам покажется, что каждый раз писать example1.XXX утомительно, можно воспользоваться псевдонимом (созданным при помощи as) и переписать example2.py следующим образом:

#example2.py
import example1 as e1
# imported string
print("The imported string is: ", e1.MY_EX1_STRING)
# imported function
e1.yolo(10)

Как вы правильно догадались, вывод останется прежним.

Но что именно происходит, когда мы пишем оператор import?

Интерпретатор Python пытается найти в sys.path каталог с модулем, который мы пытаемся импортировать. sys.path — это список каталогов, в которых Python будет искать после просмотра кэшированных модулей и модулей стандартной библиотеки Python.

Давайте посмотрим, что в данный момент содержит наш системный путь sys.path (предварительно закомментировав предыдущие строки кода в example2.py).

#example2.py
# import example1
# print("The imported string is: ", example1.MY_EX1_STRING)
# example1.yolo(10)
import sys
print(sys.path)

Как видите, самый первый элемент в полученном списке sys.path указывает на каталог Medium_Imports_Tutorial/scripts, в котором находится наш импортированный модуль, т. е. example1.py. Имейте в виду: то, что этот каталог волшебным образом присутствует в sys.path, не случайно.

Вывод из sys.path всегда будет содержать текущий каталог с индексом 0! Текущий каталог — это тот, в котором находится запускаемый скрипт.

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

Что делать, если нужно импортировать только определенные элементы из модуля?

В нашем примере в модуле example1.py определены только переменная типа string и функция. Важно помнить, что всякий раз, когда выполняется оператор импорта, будет запущен весь модуль. Чтобы доказать это, давайте немного изменим example1.py:

#example1.py
print("Thanks for importing Example1 module.")
MY_EX1_STRING = 'Welcome to Example1 module!'
def yolo(x: int):
     print("You only LIve", x, "times.")
yolo(10000)

А теперь попробуйте запустить example2.py. Вы увидите, что вместе с выводом оператора print() также выведется yolo(10000).

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

#example1.py
print("Thanks for importing Example1 module.")
MY_EX1_STRING = 'Welcome to Example1 module!'
def yolo(x: int):
     print("You only LIve", x, "times.")
if __name__ == '__main__':
     yolo(10000)

Код внутри оператора if__name__ == '__main__' не будет выполняться при импорте, но yolo() и MY_EX1_STRING, определенные снаружи, готовы к использованию через импорт. При этом, если бы мы запустили example1.py как автономный модуль, код внутри оператора if был бы выполнен.

Итак, мы увидели, что импорт модуля запускает все его содержимое (если не использовать if __name__ == «__main__»). Теперь должно быть довольно понятно, почему импорт только интересующих элементов имеет смысл. Давайте посмотрим, как это сделать в example2.py. Для этого импортируем из example1.py только функцию yolo(). Это также поможет нам избавиться от записи через точку, и мы сможем просто использовать функцию yolo().

#example2.py
from example1 import yolo
yolo(10)

Точно так же мы могли бы написать from example1 import yolo, MY_EX1_STRING, чтобы импортировать оба объекта из example1.py.

Примечание. В коде часто можно увидеть такие импорты, как from example1 import *. По сути, это означает импорт всего. Но это считается плохой практикой, поскольку негативно влияет на читабельность кода.

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

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

Пакет utils будет содержать три модуля — length.py, lower.py и upper.py для возврата длины строки и строк в нижнем и верхнем регистре соответственно.

Также создадим модуль example3_outer.py в корне проекта. Сюда мы будем импортировать модули из пакета utils.

Содержимое трех модулей будет следующим:

#utils/length.py
def get_length(name: str):
    return len(name)
#utils/lower.py
def to_lower(name: str):
    return name.lower()
#utils/upper.py
def to_upper(name: str):
    return name.upper()

Теперь, чтобы импортировать модуль length.py в example3_outer.py, пишем следующее:

#example3_outer.py
import utils.length
res = utils.length.get_length("Hello")
print("The length of the string is: ",res)

Важно отметить, что если бы мы выполнили импорт length вместо импорта utils.length, мы получили бы ModuleNotFoundError: No module named ‘length’. Это связано с тем, что список sys.path пока не содержит каталога ../Medium_Imports_Tutorial/utils, который необходим для поиска модуля length.py. Давайте посмотрим, как мы можем добавить его в этот список.

Есть два способа сделать это.

Способ 1: использование sys.path.append

#example3_outer.py
import os
import sys
fpath = os.path.join(os.path.dirname(__file__), 'utils')
sys.path.append(fpath)
print(sys.path)
import length
txt = "Hello"
res_len = length.get_length(txt)
print("The length of the string is: ",res_len)

Несколько вещей, которые следует учесть:

1. Порядок импорта важен. Мы сможем выполнить import length только после добавления пути к каталогу utils с помощью sys.path.append

Короче говоря, не поддавайтесь искушению объединить import os, import sys и import length в верхней части скрипта только для аккуратности!

2. os.path.dirname(__file__) возвращает абсолютный путь к текущему рабочему каталогу. Мы используем os.path.join, чтобы добавить каталог utils к этому пути.

3. Как всегда, доступ к функциям, определенным в импортированном модуле, упрощается с помощью записи через точку, т.е. length.get_length().

Способ 2: использование переменной окружения PYTHONPATH

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

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

Прежде чем изменить PYTHONPATH, давайте проверим его содержимое при помощи команды echo $PYTHONPATH в терминале (чтобы случайно не перезаписать):

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

С установленной переменной PYTHONPATH нам больше не нужно добавлять каталог к sys.path в example3_outer.py (мы закомментировали этот код в приведенном ниже фрагменте для ясности).

#example3_outer.py
#import os
#import sys
#fpath = os.path.join(os.path.dirname(__file__), 'utils')
#sys.path.append(fpath)
#print(sys.path)
import length
txt = "Hello"
res_len = length.get_length(txt)
print("The length of the string is: ",res_len)

Примечание. Как только вы закроете python, список вернется к предыдущим значениям по умолчанию. Если вы хотите добавить каталог в PYTHONPATH навсегда, добавьте команду экспорта (export PYTHONPATH=$PYTHONPATH:$(pwd)/utils) в файл ~/.bashrc. (подробнее можно почитать обсуждение на StackOverflow).

Наконец, познакомившись с обоими методами, давайте выберем один (в зависимости от ваших предпочтений и нужд) для импорта оставшихся двух модулей — upper.py и lower.py в example3_outer.py.

P.S. Мы воспользуемся методом 1 просто для удовольствия 😉

#example3_outer.py
import os
import sys
fpath = os.path.join(os.path.dirname(__file__), 'utils')
sys.path.append(fpath)
import length
import upper
import lower
txt = "Hello"
res_len = length.get_length(txt)
print("The length of the string is: ",res_len)
res_up = upper.to_upper(txt)
print("Uppercase txt: ", res_up)
res_low = lower.to_lower(txt)
print("Uppercase txt: ", res_low)

Супер! Это выглядит потрясающе. Однако было бы здорово, если бы мы могли просто выполнить команду import utils вместо того, чтобы импортировать все модули по отдельности. В конце концов, наш случай использования предполагает, что нам нужны все три функции. Итак, как это сделать?

Когда нам нужен __init__.py?

Во-первых, давайте попробуем импортировать каталог utils в файле example3_outer.py (предварительно закомментировав весь существующий код):

#example3_outer.py
import utils

Запуск этого скрипта не вызовет никакой ошибки, и это правильно — интерпретатор заглянет внутрь sys.path и найдет текущий каталог ../Medium_Imports_Tutorial с индексом 0. Это все, что ему нужно, чтобы найти каталог utils.

Теперь попробуем получить доступ к модулю length.py из utils:

#example3_outer.py
import utils
txt = "Hello"
res = utils.length.get_length(txt)

Попытавшись запустить этот скрипт, вы увидите AttributeError: module ‘utils’ has no attribute ‘length’. Это означает, что мы не сможем получить доступ к каким-либо скриптам Python внутри utils просто потому, что интерпретатор еще не знает, что это пакет!

Мы можем превратить этот каталог в пакет, добавив файл __init__.py в папку utils следующим образом:

В __init__.py мы импортируем все модули, которые, по нашему мнению, необходимы для нашего проекта.

# utils/__init__.py (incorrect way of importing)
from length import get_length
from lower import to_lower
from upper import to_upper

И сделаем вызов в example3_outer.py.

import utils
txt = "Hello"
res_low = utils.to_lower(txt)
print(res_low)

Подождите секунду! Почему мы видим ошибку при запуске example3_outer.py?

Ошибки импорта

То, как мы импортировали модули в __init__.py, может показаться логичным. Ведь __init__.py и length.py (или lower.py, upper.py) находятся на одном уровне, так что нет ни одной причины, чтобы from lower import to_lower не сработал. На самом деле, если вы запустите этот файл инициализации сам по себе, он будет выполняться безупречно (он не даст никаких результатов, но, тем не менее, будет успешно выполнен).

Но при этом мы не можем использовать описанный выше способ импорта, потому что, хотя length.py и lower.py находятся на том же уровне, что и __init__.py, это не тот уровень, с которого будет вызываться init.

В действительности, мы делаем вызов из example3_outer.py, поэтому для поиска любого импорта в sys.path будет только текущий каталог example3_outer.py, т.е. ../Medium_Imports_Tutorial.

Когда интерпретатор встречает команду import utils в файле example3_outer.py, даже если он переходит к __init__.py внутри каталога utils, sys.path не обновляется автоматически, и, следовательно, интерпретатор не может узнать, где найти модуль с именем length.

Мы должны как-то указать на расположение каталога utils. Для этого мы можем использовать относительный или абсолютный импорт в __init__.py (или установить переменную PYTHONPATH, как это было описано выше).

Относительный импорт

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

# utils/__init__.py
from .lower import to_lower
from .upper import to_upper
from .length import get_length

При указании относительного импорта мы используем запись через точку (. или ..). Одиночная точка перед lower указывает на тот же каталог, из которого вызывается импорт. Это можно представить как импорт функции to_lower() из ./lower.py. Пара точек перед названием модуля означает переход на два уровня вверх от текущего.

Абсолютный импорт

Абсолютный импорт более предпочтителен. Вы указываете абсолютный путь к импортируемому модулю из корня проекта (или любого другого каталога, к которому имеет доступ sys.path):

# utils/__init__.py
from utils.lower import to_lower
from utils.upper import to_upper
from utils.length import get_length

Теперь у программы есть гораздо больше информации по сравнению с относительным импортом. Более того, она менее подвержена взлому. sys.path имеет доступ к корню проекта, т. е. ../Medium_Imports_Tutorial, как описано выше, и оттуда он может легко найти каталог utils. (Почему? Потому что это непосредственный дочерний каталог корня проекта).

Что происходит, когда мы импортируем пакет с определенным __init__.py? 

Это работает как шаг инициализации. __init__.py — первый файл, который будет выполняться при импорте пакета. Учитывая, что здесь мы делаем весь необходимый импорт, код в вызывающем скрипте становится намного чище. К примеру, example3_outer.py будет выглядеть так:

#example3_outer.py
import utils
txt = "Hello"
res_len = utils.get_length(txt)
print(res_len)
res_up = utils.to_upper(txt)
print(res_up)
res_low = utils.to_lower(txt)
print(res_low)

Потрясающе! Мы преобразовали наш каталог utils в пакет. Прелесть этого пакета в том, что его можно импортировать куда угодно и использовать практически сразу. Давайте посмотрим, как мы можем использовать этот пакет внутри каталога scripts. Для этого создадим новый файл с именем example3.py в scripts.

# scripts/example3.py
import os
import sys
PROJECT_ROOT = os.path.abspath(os.path.join(
                  os.path.dirname(__file__), 
                  os.pardir)
)
sys.path.append(PROJECT_ROOT)

import utils
print(utils.get_length("Hello"))
************** OUTPUT *********
5

Несколько вещей, которые следует учитывать:

  • Перед импортом пакета utils мы должны убедиться, что родительский каталог utils, т.е. корень проекта, доступен для интерпретатора Python. Было бы неосмотрительно предполагать, что это произойдет по умолчанию, в основном потому, что мы сейчас находимся на один уровень ниже корневого каталога проекта (мы запускаем скрипт из scripts/example3.py), и в sys.path под индексом 0 будет ../Medium/Imports_Tutorial/scripts.
  • os.path.dirname(__file__) даст имя каталога для текущего скрипта, а os.pardir даст путь к родительскому каталогу, используя точечную нотацию, т.е. .. . В общем, os.path.abspath будет предоставлять абсолютный путь к корню проекта.

Бонус: мы даже можем добавлять в наш __init__.py модули из других каталогов. Например, давайте добавим yolo(), определенный в scripts/example1.py.

# utils/__init__.py
from utils.lower import to_lower
from utils.upper import to_upper
from utils.length import get_length
from scripts.example1 import yolo

Вызов этой функции в example3.py будет выглядеть следующим образом:

# scripts/example3.py
import os
import sys
PROJECT_ROOT = os.path.abspath(os.path.join(
                  os.path.dirname(__file__), 
                  os.pardir)
)
sys.path.append(PROJECT_ROOT)
import utils
print(utils.get_length("Hello"))
utils.yolo(2)
************** OUTPUT *********
5
You only LIve 2 times.

Заключение

Итак, сегодня мы обсудили, как импортировать в Python. Честно говоря, поначалу ошибки импорта действительно пугают, потому что это та область, о которой не так много говорят. Однако есть один полезный прием: какой бы пакет/модуль вы ни пытались импортировать с помощью import XYZ, убедитесь, что интерпретатор Python имеет к нему доступ. Если нет, обновите sys.path или, что еще лучше, добавьте соответствующий каталог в переменную PYTHONPATH.

Надеемся, данная статья была полезна для вас! Успехов в написании кода!

Перевод статьи «Understanding Python imports, __init__.py and pythonpath — once and for all».

Содержание:

  • PYTHONHOME изменяет расположение стандартных библиотек Python,
  • PYTHONPATH изменяет путь поиска модулей по умолчанию,
  • PYTHONSAFEPATH не добавляется потенциально опасный путь,
  • PYTHONPLATLIBDIR переопределяет значение sys.platlibdir,
  • PYTHONSTARTUP имя файла, выполняемого перед стартом интерпретатора,
  • PYTHONOPTIMIZE — эквивалент параметра интерпретатора -O,
  • PYTHONBREAKPOINT — включение/отключение отладчика отладчик pdb,
  • PYTHONDEBUG — эквивалент указания опции интерпретатора -d,
  • PYTHONOLDPARSER включает традиционный анализатор LL,
  • PYTHONINSPECT — эквивалент указания параметра интерпретатора -i,
  • PYTHONUNBUFFERED — эквивалент указания параметра интерпретатора -u,
  • PYTHONVERBOSE — эквивалент указания параметра интерпретатора -v,
  • PYTHONCASEOK — игнорирует регистр символов в операторах импорта,
  • PYTHONDONTWRITEBYTECODE — Python не будет пытаться писать файлы .pyc,
  • PYTHONPYCACHEPREFIX Python будет писать файлы .pyc в зеркальном дереве каталогов,
  • PYTHONHASHSEED используется для заполнения хешей объектов str и bytes,
  • PYTHONINTMAXSTRDIGITS ограничения на глобальную длину преобразования целочисленной строки,
  • PYTHONIOENCODING переопределяет кодировку, используемую для stdin/stdout/stderr,
  • PYTHONNOUSERSITE — не добавляется пользовательский каталог site-packages в переменную sys.path,
  • PYTHONUSERBASE определяет базовый каталог пользователя,
  • PYTHONEXECUTABLE установка значения для sys.argv[0],
  • PYTHONWARNINGS — эквивалент указания параметра интерпретатора -W,
  • PYTHONFAULTHANDLER — эквивалент опции обработчика ошибок -X,
  • PYTHONTRACEMALLOC отслеживание выделения памяти Python,
  • PYTHONPROFILEIMPORTTIME покажет, сколько времени занимает импорт модулей,
  • PYTHONASYNCIODEBUG включает режим отладки модуля asyncio,
  • PYTHONMALLOC задает распределители памяти Python и/или устанавливает отладочные хуки,
  • PYTHONMALLOCSTATS печатает статистику распределителя памяти,
  • PYTHONLEGACYWINDOWSFSENCODING возвращает кодировку к своим значениям,
  • PYTHONLEGACYWINDOWSSTDIO — использование новых средства чтения и записи консоли,
  • PYTHONCOERCECLOCALE пропускает приведение устаревших локалей к UTF-8,
  • PYTHONDEVMODE включает режим разработки Python,
  • PYTHONUTF8 включает режим интерпретатора UTF-8,
  • PYTHONWARNDEFAULTENCODING выдает EncodingWarning, когда используется кодировка по умолчанию.
  • PYTHONNODEBUGRANGES отключает отображение дополнительной информацию о местоположении для каждой инструкции в объектах кода.
  • PYTHONTHREADDEBUG печатает отладочную информацию о потоках,
  • PYTHONDUMPREFS сбрасывает объекты и счетчики ссылок.
  • PYTHONDUMPREFSFILE=FILENAME сбрасывает объекты и счетчики ссылок в файл с именем FILENAME.

PYTHONHOME:

Переменная среды PYTHONHOME изменяет расположение стандартных библиотек Python. По умолчанию библиотеки ищутся в prefix/lib/pythonversion и exec_prefix/lib/pythonversion, где prefix и exec_prefix — это каталоги, зависящие от установки, оба каталога по умолчанию — /usr/local.

Когда для PYTHONHOME задан один каталог, его значение заменяет prefix и exec_prefix. Чтобы указать для них разные значения, установите для PYTHONHOME значение prefix:exec_prefix.

PYTHONPATH:

Переменная среды PYTHONPATH изменяет путь поиска по умолчанию для файлов модуля. Формат такой же, как для оболочки PATH: один или несколько путей к каталогам, разделенных os.pathsep (например, двоеточие в Unix или точка с запятой в Windows). Несуществующие каталоги игнорируются.

Помимо обычных каталогов, отдельные записи PYTHONPATH могут относиться к zip-файлам, содержащим чистые модули Python в исходной или скомпилированной форме. Модули расширения нельзя импортировать из zip-файлов.

Путь поиска по умолчанию зависит от установки Python, но обычно начинается с префикса /lib/pythonversion (см. PYTHONHOME). Он всегда добавляется к PYTHONPATH.

Дополнительный каталог будет вставлен в путь поиска перед PYTHONPATH, как описано в разделе «Варианты интерфейса командной строки Python». Путь поиска можно изменить из программы Python с помощью переменной sys.path.

PYTHONSAFEPATH:

Если для переменной среды PYTHONSAFEPATH задана непустая строка, то не добавляется потенциально опасный путь к sys.path: подробности смотрите в параметре -P.

Новое в Python 3.11.

PYTHONPLATLIBDIR:

Если в переменную PYTHONPLATLIBDIR установлена ​​непустая строка, то она переопределяет значение sys.platlibdir.

Новое в Python 3.9.

PYTHONSTARTUP:

Если переменная среды PYTHONSTARTUP` это имя файла, то команды Python в этом файле выполняются до отображения первого приглашения в интерактивном режиме. Файл выполняется в том же пространстве имен, в котором выполняются интерактивные команды, так что определенные или импортированные в нем объекты можно использовать без квалификации в интерактивном сеансе.

При запуске вызывает событие аудита cpython.run_startup с именем файла в качестве аргумента.

PYTHONOPTIMIZE:

Если в переменной среды PYTHONOPTIMIZE задана непустая строка, это эквивалентно указанию параметра -O. Если установлено целое число, то это эквивалентно указанию -ОO.

PYTHONBREAKPOINT:

Если переменная среды PYTHONBREAKPOINT установлена, то она определяет вызываемый объект с помощью точечной нотации. Модуль, содержащий вызываемый объект, будет импортирован, а затем вызываемый объект будет запущен реализацией по умолчанию sys.breakpointhook(), которая сама вызывается встроенной функцией breakpoint(). Если PYTHONBREAKPOINT не задан или установлен в пустую строку, то это эквивалентно значению pdb.set_trace. Установка этого значения в строку 0 приводит к тому, что стандартная реализация sys.breakpointhook() ничего не делает, кроме немедленного возврата.

Новое в Python 3.7.

PYTHONDEBUG:

Если значение переменной среды PYTHONDEBUG непустая строка, то это эквивалентно указанию опции -d. Если установлено целое число, то это эквивалентно многократному указанию -dd.

PYTHONOLDPARSER:

Если значение переменной среды PYTHONOLDPARSER непустая строка, то включается традиционный анализатор LL (старый парсер).

Не рекомендуется с Python 3.9, будет удалено в Python 3.10.

PYTHONINSPECT:

Если значение переменной среды PYTHONINSPECT непустая строка, то это эквивалентно указанию параметра -i.

Эта переменная также может быть изменена кодом Python с помощью os.environ для принудительного режима проверки при завершении программы.

PYTHONUNBUFFERED:

Если значение переменной среды PYTHONUNBUFFERED непустая строка, то это эквивалентно указанию параметра -u.

PYTHONVERBOSE:

Если значение переменной среды PYTHONVERBOSE непустая строка, то это эквивалентно указанию опции -v. Если установлено целое число, это эквивалентно многократному указанию -v.

PYTHONCASEOK:

Если значение переменной среды PYTHONCASEOK установлено, то Python игнорирует регистр символов в операторах импорта. Это работает только в Windows и OS X.

PYTHONDONTWRITEBYTECODE:

Если значение переменной среды PYTHONDONTWRITEBYTECODE непустая строка, то Python не будет пытаться писать файлы .pyc при импорте исходных модулей. Это эквивалентно указанию параметра -B.

PYTHONPYCACHEPREFIX:

Если значение переменной среды PYTHONPYCACHEPREFIX установлено, то Python будет записывать файлы .pyc в зеркальном дереве каталогов по этому пути, а не в каталогах __pycache__ в исходном дереве. Это эквивалентно указанию параметра -X pycache_prefix=PATH.

Новое в Python 3.8.

PYTHONHASHSEED:

Если значение переменной среды PYTHONHASHSEED не установлено ​​или имеет значение random, то случайное значение используется для заполнения хешей объектов str и bytes.

Если для PYTHONHASHSEED задано целочисленное значение, то оно используется как фиксированное начальное число для генерации hash() типов, охватываемых рандомизацией хеша.

Цель — разрешить повторяемое хеширование, например, для самотестирования самого интерпретатора, или позволить кластеру процессов Python совместно использовать хеш-значения.

Целое число должно быть десятичным числом в диапазоне [0,4294967295]. Указание значения 0 отключит рандомизацию хеша.

PYTHONINTMAXSTRDIGITS:

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

Новое в Python 3.11.

PYTHONIOENCODING:

Если значение переменной среды PYTHONIOENCODING установлено до запуска интерпретатора, то оно переопределяет кодировку, используемую для stdin/stdout/stderr, в синтаксисе encodingname:errorhandler. И имя кодировки encodingname, и части :errorhandler являются необязательными и имеют то же значение, что и в функции str.encode().

Для stderr часть :errorhandler игнорируется, а обработчик всегда будет заменять обратную косую черту.

Изменено в версии 3.6: в Windows кодировка, указанная этой переменной, игнорируется для буферов интерактивной консоли, если также не указан PYTHONLEGACYWINDOWSSTDIO. Файлы и каналы, перенаправленные через стандартные потоки, не затрагиваются.

PYTHONNOUSERSITE:

Если значение переменной среды PYTHONNOUSERSITE установлено, то Python не будет добавлять пользовательский каталог site-packages в переменную sys.path.

PYTHONUSERBASE:

Переменная среды PYTHONUSERBASE определяет базовый каталог пользователя, который используется для вычисления пути к каталогу пользовательских пакетов сайта site-packages и путей установки Distutils для python setup.py install --user.

PYTHONEXECUTABLE:

Если значение переменной среды PYTHONEXECUTABLE установлено, то для sys.argv[0] будет установлено ее значение вместо значения, полученного через среду выполнения C. Работает только в Mac OS X.

PYTHONWARNINGS:

Переменная среды PYTHONWARNINGS эквивалентна опции -W. Если она установлена в виде строки, разделенной запятыми, то это эквивалентно многократному указанию -W, при этом фильтры, расположенные позже в списке, имеют приоритет над фильтрами ранее в списке.

В простейших настройках определенное действие безоговорочно применяется ко всем предупреждениям, выдаваемым процессом (даже к тем, которые по умолчанию игнорируются):

  • PYTHONWARNINGS=default — предупреждает один раз для каждого вызова;
  • PYTHONWARNINGS=error — преобразовывает в исключения;
  • PYTHONWARNINGS=always — предупреждает каждый раз;
  • PYTHONWARNINGS=module — предупреждает один раз для каждого вызванного модуля;
  • PYTHONWARNINGS=once — предупреждает один раз для каждого процесса Python;
  • PYTHONWARNINGS=ignore — никогда не предупреждает.

PYTHONFAULTHANDLER:

Если значение переменной среды PYTHONFAULTHANDLER непустая строка, то при запуске вызывается faulthandler.enable(): устанавливается обработчик сигналов SIGSEGV, SIGFPE, SIGABRT, SIGBUS и SIGILL, чтобы вывести данные трассировки Python. Это эквивалентно опции обработчика ошибок -X.

PYTHONTRACEMALLOC:

Если значение переменной среды PYTHONTRACEMALLOC непустая строка, то начнется отслеживание выделения памяти Python с помощью модуля tracemalloc. Значение переменной — это максимальное количество кадров, хранящихся в обратной трассировке trace. Например, PYTHONTRACEMALLOC=1 сохраняет только самый последний кадр.

PYTHONPROFILEIMPORTTIME:

Если значение переменной среды PYTHONPROFILEIMPORTTIME непустая строка, то Python покажет, сколько времени занимает каждый импорт. Это в точности эквивалентно установке -X importtime в командной строке.

Новое в Python 3.7.

PYTHONASYNCIODEBUG:

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

PYTHONMALLOC:

Переменная PYTHONMALLOC задает распределители памяти Python и/или устанавливает отладочные хуки.

Задает семейство распределителей памяти, используемых Python

:

  • default: использует распределители памяти по умолчанию.
  • malloc: использует функцию malloc() библиотеки C для всех доменов (PYMEM_DOMAIN_RAW, PYMEM_DOMAIN_MEM, PYMEM_DOMAIN_OBJ).
  • pymalloc: использует распределитель pymalloc для доменов PYMEM_DOMAIN_MEM и PYMEM_DOMAIN_OBJ и использует функцию malloc() для домена PYMEM_DOMAIN_RAW.
Устанавливает хуки отладки

:

  • debug: устанавливает хуки отладки поверх распределителей памяти по умолчанию.
  • malloc_debug: то же, что и malloc, но также устанавливает отладочные хуки.
  • pymalloc_debug: то же, что и pymalloc, но также устанавливает отладочные хуки.

См. Распределители памяти по умолчанию и функцию PyMem_SetupDebugHooks () (установите отладочные хуки на распределителях памяти Python).

Изменено в Python 3.7: Добавлен распределитель по умолчанию default.

Новое в Python 3.6.

PYTHONMALLOCSTATS:

Если значение переменной среды PYTHONMALLOCSTATS ​​непустая строка, то Python будет печатать статистику распределителя памяти pymalloc каждый раз, когда создается новая область объекта pymalloc, а также при завершении работы.

Эта переменная игнорируется, если переменная среды PYTHONMALLOC используется для принудительного использования распределителя malloc() библиотеки C или если Python настроен без поддержки pymalloc.

Изменено в Python 3.6: эту переменную теперь также можно использовать в Python, скомпилированном в режиме релиза. Теперь она не действует, если задана пустая строка.

PYTHONLEGACYWINDOWSFSENCODING:

Если значение переменной среда Python PYTHONLEGACYWINDOWSFSENCODING непустая строка, то кодировка файловой системы по умолчанию и режим ошибок вернутся к своим значениям mbcs и replace до версии Python 3.6 соответственно. В противном случае используются новые значения по умолчанию utf-8 и surrogatepass.

Доступность: Windows.

PYTHONLEGACYWINDOWSSTDIO:

Если значение переменной среды PYTHONLEGACYWINDOWSSTDIO непустая строка, то новые средства чтения и записи консоли не используются. Это означает, что символы Unicode будут закодированы в соответствии с активной кодовой страницей консоли, а не с использованием utf-8.

Эта переменная игнорируется, если стандартные потоки перенаправляются в файлы или каналы, а не ссылаются на буферы консоли.

Доступность: Windows.

Новое в Python 3.6.

PYTHONCOERCECLOCALE:

Если значение переменной среды PYTHONCOERCECLOCALE установлено в значение 0, то это заставит основное приложение командной строки Python пропускать приведение устаревших локалей C и POSIX на основе ASCII к более функциональной альтернативе на основе UTF-8.

Если эта переменная не установлена ​​или имеет значение, отличное от 0, то переменная среды переопределения локали LC_ALL также не задана, а текущая локаль, указанная для категории LC_CTYPE, является либо локалью C по умолчанию, либо локалью POSIX явно основанной на ASCII, то Python CLI попытается настроить следующие локали для категории LC_CTYPE в порядке, указанном перед загрузкой среды выполнения интерпретатора:

  • C.UTF-8,
  • C.utf8,
  • UTF-8.

Если установка одной из этих категорий локали прошла успешно, то переменная среды LC_CTYPE также будет установлена ​​соответствующим образом в текущей среде процесса до инициализации среды выполнения Python. Это гарантирует, что обновленный параметр будет виден как самому интерпретатору, так и другим компонентам, зависящим от локали, работающим в одном процессе (например, библиотеке GNU readline), и в субпроцессах (независимо от того, работают ли эти процессы на интерпретаторе Python или нет), а также в операциях, которые запрашивают среду, а не текущую локаль C (например, собственный locale.getdefaultlocale() Python).

Настройка одного из этих языковых стандартов явно или с помощью указанного выше неявного принуждения языкового стандарта автоматически включает обработчик ошибок surrogateescape для sys.stdin и sys.stdout (sys.stderr продолжает использовать обратную косую черту, как и в любой другой локали). Это поведение обработки потока можно переопределить, используя PYTHONIOENCODING, как обычно.

Для целей отладки, установка PYTHONCOERCECLOCALE=warn приведет к тому, что Python будет выдавать предупреждающие сообщения на stderr, если активируется принуждение языкового стандарта или если языковой стандарт, который мог бы вызвать приведение, все еще активен при инициализации среды выполнения Python.

Также обратите внимание

, что даже когда принуждение языкового стандарта отключено или когда не удается найти подходящую целевую локаль, переменная среды PYTHONUTF8 все равно будет активироваться по умолчанию в устаревших локалях на основе ASCII. Чтобы для системных интерфейсов интерпретатор использовал ASCII вместо UTF-8, необходимо обе переменные отключить.

Доступность: *nix системы.

Новое в версии 3.7

PYTHONDEVMODE:

Если значение переменной среды PYTHONDEVMODE непустая строка, то включится режим разработки Python, введя дополнительные проверки времени выполнения, которые слишком «дороги» для включения по умолчанию.

Новое в версии 3.7

PYTHONUTF8:

Если переменная среды PYTHONUTF8 установлена в значение 1, то это включает режим интерпретатора UTF-8, где UTF-8 используется как кодировка текста для системных интерфейсов, независимо от текущей настройки локали.

  • sys.getfilesystemencoding() возвращает 'UTF-8' (кодировка языкового стандарта игнорируется).
  • locale.getpreferredencoding() возвращает 'UTF-8' (кодировка языкового стандарта игнорируется, а параметр функции do_setlocale не действует).
  • sys.stdin, sys.stdout и sys.stderr все используют UTF-8 в качестве кодировки текста, при этом обработчик ошибок surrogateescape включен для sys.stdin и sys.stdout (sys.stderr продолжает использовать обратную косую черту, как и в режим с учетом локали по умолчанию)

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

  • Аргументы командной строки, переменные среды и имена файлов декодируются в текст с использованием кодировки UTF-8.
  • os.fsdecode() и os.fsencode() используют кодировку UTF-8.
  • open(), io.open() и codecs.open() по умолчанию используют кодировку UTF-8. Однако они по-прежнему используют обработчик ошибок strict по умолчанию, так что попытка открыть двоичный файл в текстовом режиме может вызвать исключение, а не создавать бессмысленные данные.
Обратите внимание

, что стандартные настройки потока в режиме UTF-8 могут быть отменены с помощью PYTHONIOENCODING так же, как они могут быть в режиме с учетом локали по умолчанию.

Если установлено значение 0, то интерпретатор работает в режиме с учетом локали по умолчанию.

Установка любой другой непустой строки вызывает ошибку при инициализации интерпретатора.

Если переменная среды PYTHONUTF8 вообще не задана, то интерпретатор по умолчанию использует текущие настройки локали, если только текущая локаль не определена как устаревшая локаль на основе ASCII (как описано для PYTHONCOERCECLOCALE), и принуждение локали отключено или не работает. В таких устаревших региональных стандартах интерпретатор по умолчанию будет включать режим UTF-8, если явно не указано иное.

Установка переменной среды PYTHONUTF8 также доступна как опция интерпретатора -X utf8.

Новое в версии 3.7.

PYTHONWARNDEFAULTENCODING:

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

Новое в версии 3.10.

PYTHONNODEBUGRANGES:

Если переменная PYTHONNODEBUGRANGES установлена, то она отключает включение таблиц, отображающих дополнительную информацию о местоположении (конечная строка, смещение начального столбца и смещение конечного столбца) для каждой инструкции в объектах кода. Это полезно, когда требуются меньшие объекты кода и файлы .pyc, а также подавление дополнительных визуальных индикаторов местоположения, когда интерпретатор отображает трассировку.

Новое в Python 3.11.

Переменные среды режима отладки.

Установка этих переменных влияет только на отладочную сборку Python.

PYTHONTHREADDEBUG:

Если значение переменной среды PYTHONTHREADDEBUG установлено, то Python распечатает отладочную информацию о потоках.

Нужен Python, настроенный с параметром сборки --with-pydebug.

PYTHONDUMPREFS:

Если значение переменной среды PYTHONDUMPREFS установлено, то Python будет сбрасывать объекты и счетчики ссылок, все еще живые после завершения работы интерпретатора.

Нужен Python, настроенный с параметром сборки --with-trace-refs.

PYTHONDUMPREFSFILE=FILENAME:

Если установлено, то Python будет сбрасывать объекты и счетчики ссылок после завершения работы интерпретатора в файл с именем FILENAME.

Нужен Python, настроенный (установленный) с параметром сборки --with-trace-refs.

Новое в Python 3.11.

Понравилась статья? Поделить с друзьями:
  • Как изменить местоположение папки temp
  • Как изменить местоположение net graph
  • Как изменить местоположение mobile legends
  • Как изменить местоположение gps
  • Как изменить местоположение google play