Как передать переменную в другой файл python

Обновлено: 07.07.2024

Разрабатывая приложения вам придется работать с файлами, анализировать большие объемы данных, сохранять пользовательские данные, чтобы они не терялись по завершению работы программы. Также при работе с файлами важно научиться обрабатывать ошибки, чтобы они не привели к аварийному завершению программы. Для этого в Python существуют специальные объекты - исключения, которые создаются для управления ошибок.

1. Чтение файла в Python

3.1415926535

В случае, если файл расположен не в одном каталоге с файлом программы, необходимо указать путь, чтобы Python искал файлы в конкретном месте. Существует два пути как прописать расположение файла:

Относительный путь.

Относительный путь приказывает Python искать файлы в каталоге, который задается относительно каталога, в котором находится текущий файл программы

Абсолютный путь.

Местонахождение файла не зависит от того, где находится ваша программа. Абсолютные пути обычно длиннее относительных, поэтому их лучше сохранить в переменную и затем передать функции open() .

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

1.2. Чтение больших файлов на Python и работа с ними

Выведем на экран первые 100 знаков после запятой. Добавим в конец функцию len, чтобы узнать длину файла

3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

1000002

Из выходных данных видно, что строка содержит значение "Пи" с точностью до 1 000 000 знаков после запятой. В Python нет никаких ограничений на длину данных, с которыми можно работать, единственное ограничение это объем памяти вашей системы.

После сохранения данных в переменной можно делать с ними все что угодно. Давайте проверим, входит ли в число "Пи" дата вашего дня рождения. Напишем небольшую программу, которая будет читать файл и проверять входит ли дата день рождения в первый миллион числа "Пи":

Начало программы не изменилось, читаем файл и сохраняем данные в переменной digits. Далее запрашиваем данные от пользователя с помощью функции input и сохраняем в переменную birstday. Затем проверяем вхождение birstday в digits с помощью команды if-else. Запустив несколько раз программу, получим результат:

В зависимости от введенных данных мы получили результат вхождения или не вхождения дня рождения в число "Пи"

Важно: Читая данные из текстового файла, Python интерпретирует весь текст как строку. Если вы хотите работать с ним в числовом контексте, то преобразуйте данные в целое число функцией int() или в вещественное число функцией float().

1.3. Анализ текста из файла на Python

Для подсчета вхождения слова или выражений в строке можно воспользоваться методом count() , но прежде привести все слова к нижнему регистру функцией lower() . Количество вхождений сохраним в переменной n_alice.

Чтобы подсчитать количество слов в тексе, воспользуемся методом split() , предназначенный для построения списка слов на основе строки. Метод split() разделяет строку на части, где обнаружит пробел и сохраняет все части строки в элементах списка. Пример метода split() :

После использования метода split() , сохраним список в переменной words и далее подсчитаем количество слов в списке, с помощью функции len() . После подсчета всех данных, выведем на экран результат:

2.1. Запись в пустой файл в Python

Язык программирования Python

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

Файлы можно открывать в режимах:

2.2. Многострочная запись в файл на Python

При использовании функции write() символы новой строки не добавляются в записываемый файл:

В результате открыв файл мы увидим что все строки склеились:

Язык программирования PythonЯзык программирования JavaЯзык программирования Perl

Результат будет выглядеть так:

Язык программирования Python
Язык программирования Java
Язык программирования Perl

2.3. Присоединение данных к файлу на Python

В результате к нашему файлу добавятся две строки:

Язык программирования Python
Язык программирования Java
Язык программирования Perl
Hello world
Полет на луну

3. Исключения в Python

При выполнении программ могут возникать ошибки, для управления ими Python использует специальные объекты, называемые исключениями. Когда в программу включен код обработки исключения, ваша программа продолжится, а если нет, то программа остановится и выведет трассировку с отчетом об исключении. Исключения обрабатываются в блоках try-except . С блоками try-except программы будут работать даже в том случае, если что-то пошло не так.

3.1. Блоки try-except на Python

Приведем пример простой ошибки деления на ноль:

Traceback (most recent call last):
File "example.py", line 1, in <module>
print(7/0)
ZeroDivisionError: division by zero

Если в вашей программе возможно появление ошибки, то вы можете заранее написать блок try-except для обработки данного исключения. Приведем пример обработки ошибки ZeroDivisionError с помощью блока try-except :

try :
print(7/0)
except ZeroDivisionError:
print("Деление на ноль запрещено")

Деление на ноль запрещено

Если за кодом try-except следует другой код, то Python продолжит выполнение программы.

3.2. Блок try-except-else на Python

Напишем простой калькулятор, который запрашивает данные у пользователя, а затем результат деления выводит на экран. Сразу заключим возможную ошибку деления на ноль ZeroDivisionError и добавим блок else при успешном выполнение блока try .

Введите первое число: 30
Введите второе число: 5
Частное двух чисел равно 6.0
Введите первое число: 7
Введите второе число: 0
Деление на ноль запрещено
Введите первое число: q

В результате действие программы при появлении ошибки не прервалось.

3.3. Блок try-except с текстовыми файлами на Python

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

Так как такого файла не существует, Python выдает исключение:

FileNotFoundError - это ошибка отсутствия запрашиваемого файла. С помощью блока try-except обработаем ее:

В результате при отсутствии файла мы получим:

Запрашиваемый файл alice_2.txt не найден

3.4. Ошибки без уведомления пользователя

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

В результате при запуске этой программы и отсутствия запрашиваемого файла ничего не произойдет.

Однако я не могу заставить file2 распознавать переменные из file1, даже если он уже импортирован в file1. Было бы чрезвычайно полезно, если это возможно каким-либо образом.

Импорт file2 в file1.py глобальные (то есть, на уровне модуля) имена, связанные в file2 , доступные для следующего кода в file1 - единственное такое имя - SomeClass . Он не делает наоборот: имена, определенные в file1 , не доступны для кода в file2 , когда file1 импортирует file2 . Это было бы так, даже если вы импортировали правильный путь ( import file2 , как правильно рекомендует @nate), а не ужасным, ужасным способом вы делаете это (если бы все под солнцем забыли само существование конструкции from . import * , жизнь была бы такой намного лучше для всех).

Очевидно, вы хотите сделать глобальные имена, определенные в file1 , доступными для кода в file2 и и наоборот. Это известно как «циклическая зависимость» и является ужасной идеей (в Python или где-либо еще в этом отношении).

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

Например, вы можете поместить глобальные имена, которые должны быть доступны обоим модулям, в третий модуль (например, file3.py , чтобы продолжить серию имен ;-) и импортировать третий модуль в каждый из двух других ( import file3 в обоих ---- +: = 15 =: + ---- и file1 , а затем используйте file2 и т. Д., То есть квалифицированные имена, с целью доступа к этим глобальным именам или установки их из одного или обоих другие модули, не голые имена).

Конечно, может быть предложена все более конкретная помощь, если вы уточнили (отредактировав свой Q) именно то, почему вы считаете, что вам нужна циклическая зависимость (всего лишь один простой прогноз: независимо от того, что вас заставляет думаю, что вам нужна циклическая зависимость, вы ошибаетесь; -).

Когда вы пишете

фактически копирует имена, определенные в file2 , в пространство имен file1 . Так что если вы переназначаете эти имена в file1 , написав

например, это будет сделано только в file1 , а не в file2 . Обратите внимание, что если вы хотите изменить атрибут на foo , скажем, выполните

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

Вы можете получить желаемый эффект, выполнив это в file1.py :

(обратите внимание, что вам следует удалить from foo import * ), хотя я бы посоветовал тщательно подумать, действительно ли вам это нужно делать. Нечасто, что изменение переменных одного модуля из другого модуля действительно оправдано.

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

ОТВЕТЫ

Ответ 1

Надеюсь, что это хорошо, чтобы записать мои заметки об этой проблеме.

Прежде всего, я очень ценю пример в OP, потому что именно там я и начал - хотя это заставило меня думать, что shared - это какой-то встроенный модуль Python, пока я не нашел полный пример в [Tutor] Глобальные переменные между модулями?.

Однако, когда я искал "совместное использование переменных между скриптами" (или процессов) - помимо случая, когда Python script должен использовать переменные, определенные в других исходных файлах Python (но не обязательно запущенные процессы) - я в основном споткнулся в двух других случаях использования:

  • A script разворачивается в несколько дочерних процессов, которые затем запускаются параллельно (возможно, на нескольких процессорах) на одном ПК
  • A script генерирует несколько других дочерних процессов, которые затем запускаются параллельно (возможно, на нескольких процессорах) на одном ПК

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

В то же время я заинтересован в нескольких вызовах одного и того же script, запускался независимо и обменивался данными между ними (как в Python: как разделить объект экземпляр через несколько вызовов script) в режиме singleton/single instance. Эта проблема на самом деле не устранена вышеупомянутыми двумя случаями - вместо этого она существенно сводится к примеру в OP (обмен переменными через два сценария).

Теперь, имея дело с этой проблемой в Perl, есть IPC::Shareable; который "позволяет привязать переменную к общей памяти", используя "целое число или 4 символьную строку [1], которая служит общим идентификатором для данных в пространстве процесса". Таким образом, нет временных файлов, а также сетевых настроек, которые я считаю отличными для моего варианта использования; поэтому я искал то же самое в Python.

Однако, как принятый ответ от @Drewfer отмечает: "Вы не сможете делать то, что хотите, не сохраняя информацию где-то внешнюю по отношению к двум экземпляры переводчика"; или другими словами: либо вы должны использовать настройку сети/сокета, либо вам нужно использовать временные файлы (ergo, нет общей RAM для "полностью отдельных сеансов python" ).

Теперь даже с этими соображениями трудно найти рабочие примеры (кроме pickle ) - также в документах для mmap и multiprocessing. Мне удалось найти другие примеры, которые также описывают некоторые подводные камни, о которых не говорится в документах:

  • Использование mmap : рабочий код в двух разных сценариях в Обмен данными Python между процессами с помощью mmap | блог schmichael
    • Демонстрирует, как оба сценария изменяют общее значение
    • Обратите внимание, что здесь временный файл создается как хранилище для сохраненных данных. mmap - это просто специальный интерфейс для доступа к этому временному файлу.
    • Python многопроцессорный RemoteManager под многопроцессорным процессом. Процесс - рабочий пример SyncManager (через manager.start() ) с общим Queue ; сервер пишет, клиенты читают (общие данные)
    • Сравнение модуля многопроцессорности и pyro? - рабочий пример BaseManager (через server.serve_forever() ) с общим пользовательским классом; сервер пишет, клиент читает и пишет
    • Как синхронизировать python dict с многопроцессорностью - этот ответ имеет большое объяснение ошибок multiprocessing и является рабочим примером SyncManager (через manager.start() ) с общим dict; сервер ничего не делает, клиент читает и пишет

    Благодаря этим примерам я привел пример, который по существу делает то же самое, что и пример mmap , с подходами из примера "синхронизировать python dict" - используя BaseManager (через manager.start() через файл адрес пути) с общим списком; как для чтения, так и для чтения и записи на сервере и клиенте (вставка ниже). Обратите внимание:

    Все манипуляции с dict должны выполняться с помощью методов, а не диктовых назначений (syncdict [ "blast" ] = 2 терпит неудачу из-за того, что многопроцессорность делится пользовательскими объектами)

    Обходным путем для dict['key'] получения и настройки является использование открытых методов dict get и update . Проблема в том, что нет таких общедоступных методов, как альтернатива для list[index] ; таким образом, для общего списка, кроме того, мы должны регистрировать методы __getitem__ и __setitem__ (которые являются частными для list ) как exposed , что означает, что нам также необходимо перерегистрировать все общедоступные методы для list , а также :/

    Ну, я думаю, что это были самые важные вещи; это два сценария - их можно просто запустить в отдельных терминалах (сначала сервер); примечание, разработанное на Linux с Python 2.7:

    Как последнее замечание, в Linux /tmp/mypipe создан - но он равен 0 байтам и имеет атрибуты srwxr-xr-x (для сокета); Я думаю, это радует меня, так как мне не нужно беспокоиться о сетевых портах, а также о временных файлах как таковых :)

    Другие связанные вопросы:

    • Python: возможность совместного использования данных в памяти между двумя отдельными процессами (очень хорошее объяснение)
    • Эффективный Python для Python IPC
    • Python: отправка переменной в другую script

    Ответ 2

    Вы не сможете делать то, что хотите, не сохраняя информацию где-то внешнюю по отношению к двум экземплярам интерпретатора.
    Если это просто простые переменные, которые вы хотите, вы можете легко сбрасывать питон python в файл с помощью модуля pickle в script one, а затем повторно загружать его в script два. Пример:

    Ответ 3

    sudo apt-get install memcached python-memcache

    Ответ 4

    То, что вы пытаетесь сделать здесь (сохранение общего состояния в модуле Python над отдельными интерпретаторами python), не будет работать.

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

    Ответ 5

    Вы можете использовать относительный простой файл mmap. Вы можете использовать shared.py для хранения общих констант. Следующий код будет работать с разными интерпретаторами Python\scripts\process

    * "Глобальный" - это синтаксис Windows для глобальных имен

    * Этот код был написан для Windows, Linux может нуждаться в небольших корректировках

    Ответ 6

    Вам нужно сохранить переменную в каком-то постоянном файле. Для этого есть несколько модулей, в зависимости от вашей конкретной потребности.

    Модуль pickle и cPickle может сохранять и загружать большинство объектов python в файл.

    Модуль полки может хранить объекты python в словаре-подобной структуре (используя рассол за кулисами).

    Модули dbm/bsddb/dbhash/gdm могут хранить строковые переменные в словаре-подобной структуре.

    Модуль sqlite3 может хранить данные в легкой базе данных SQL.

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

    Ответ 7

    Я бы посоветовал вам использовать модуль multiprocessing. Вы не можете запускать два сценария из командной строки, но вы можете иметь два отдельных процесса, которые легко могут разговаривать друг с другом.

    Из примеров документа:

    Ответ 8

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

    Ответ 9

    В вашем примере первый script запускается до завершения, а затем запускается второй script. Это означает, что вам нужно какое-то постоянное состояние. Другие ответы предложили использовать текстовые файлы или Python pickle . Лично я ленив, и я бы не использовал текстовый файл, когда мог использовать pickle ; почему я должен писать парсер для анализа собственного формата текстового файла?

    Вместо pickle вы также можете использовать модуль json для хранения его как JSON. Это может быть предпочтительнее, если вы хотите поделиться данными с программами, отличными от Python, поскольку JSON - простой и общий стандарт. Если ваш Python не имеет json , получите simplejson.

    Если ваши потребности превышают pickle или json - скажем, вы действительно хотите, чтобы одновременно выполнялись две программы Python и обновляли постоянные переменные состояния в реальном времени - я предлагаю вам использовать SQLite. Используйте ORM для абстрагирования базы данных, и это очень просто. Для SQLite и Python я рекомендую Autumn ORM.

    Я пытаюсь найти способ импортировать переменные ( dicts) из файла, который будет использоваться внутри как класс , как переменные класса. Поскольку я не могу использовать from myVarFile import * внутри класса, только на уровне модуля, как бы я импортировал их в качестве переменных класса

    В качестве теста я попытался присвоить 'global' всем переменным в myVarFile и добавить имена глобальных переменных внутри класса, это работает на уровне класса. Но я не могу заставить какие-либо методы работать вообще, например

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

    Наследуют ли методы переменные класса, если они глобально объявлены из импортированного файла ?

    3 ответа

    Я уже некоторое время пытаюсь читать файлы python и печатать его переменные. Можно ли просмотреть и распечатать переменные другого файла без его импорта или запуска? Все, что я уже искал, только объясняет, как импортировать или использовать execfile и т. д. (Отказ от ответственности, я, вероятно.

    Можно ли импортировать сценарий Python в основной сценарий,а затем просто использовать переменные? Я не хочу, чтобы другой сценарий выполнялся внутри основного сценария, просто прикрепите одну из переменных.

    Вы всегда можете добавить атрибуты в класс вне тела класса:

    или вы можете просто импортировать имя без синтаксиса * :

    Импорт объекта в основном является назначением; import name или from module import name устанавливает name в текущем пространстве имен.

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

    Итак, в базовом модуле:

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

    Если это не вариант, скопируйте пространство имен:

    Однако , если все, что вам нужно сделать, это 'read' значение из ваших методов, вы можете просто ссылаться на глобалы, вам не нужно создавать атрибуты класса таких объектов. Просто удалите префикс self. из таких имен, и ваш код будет работать просто отлично.

    Я хочу импортировать определенную переменную из другого файла Javascript. Теперь я делаю это стандартным способом. Например, у меня есть файл validation.js , где у меня есть следующий код: export const profile = <. >Моя проблема заключается в том, что я хочу импортировать эту переменную из.

    Если у вас есть файл source.py с таким классом:

    и еще один файл import_test.py , вы можете сделать это:

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

    В конце концов я использовал следующее :

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

    Похожие вопросы:

    Мне было интересно, не лучше ли импортировать переменные в ваше представление из файла settings.py? или лучше создать конфигурационный файл с нужными переменными? Я склонен писать конфигурационные.

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

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

    Я уже некоторое время пытаюсь читать файлы python и печатать его переменные. Можно ли просмотреть и распечатать переменные другого файла без его импорта или запуска? Все, что я уже искал, только.

    Можно ли импортировать сценарий Python в основной сценарий,а затем просто использовать переменные? Я не хочу, чтобы другой сценарий выполнялся внутри основного сценария, просто прикрепите одну из.

    Я не могу импортировать функции из другого файла py. Как я могу импортировать функцию из другого py-файла в том же каталоге? Два файла py находятся в одном каталоге. Версия Python-это 3.7. OS-это.

    Автор оригинала: Peter Rubio.

    Вступление

    Импортируйте!

    Если вы когда-либо импортировали что-то вроде случайного, Numpy или Math, то это действительно так просто, как это! Если у вас нет, то вот быстрый взгляд на то, как это сделано.

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

    Во-первых, мы им импортируем.

    Чтобы увидеть доступные функции и атрибуты для модуля, используйте встроенный функцию dir () :

    Кроме того, вы можете использовать ключевое слово « из », а затем имя модуля и « Импорт », а затем атрибут или функция. Таким образом, мы больше не должны использовать нотацию DOT при вызове квадратной корневой функции.

    И, как и ожидалось, пытаясь получить доступ к другим функциям или атрибутам все еще требует записи DOT:

    Определенные пользователем функции

    По мере того, как вы прогрессируете в своем кодировании Python, вы в конечном итоге создадите свои собственные функции и внедрим их в другие программы. В качестве примера мы проиллюстрируем это простым калькулятором наконечника. Я приглашаю вас следовать.

    Вот определение функции:

    Теперь, чтобы вызвать функцию из другого файла в Python, мы просто используем «импорт», а затем имя вашего .py файл:

    Если у вас есть несколько функций в вашем файле и хотели бы видеть их, не забудьте использовать Дир функция. В нашем случае он только показывает Calctip Функция:

    Кроме того, не забывайте, что мы можем использовать альтернативный метод, если вы хотите пропустить нотацию DOT:

    Вещи, чтобы осмотреть для