Как импортировать другие файлы Python? - PullRequest
633 голосов
/ 28 февраля 2010

Как мне импортировать другие файлы в Python?

  1. Как именно я могу импортировать определенный файл Python, например import file.py?
  2. Как я могу импортировать папку вместо определенного файла?
  3. Я хочу загружать файл Python динамически во время выполнения, в зависимости от пользователя вход.
  4. Я хочу знать, как загрузить только одну конкретную деталь из файла.

Например, в main.py у меня есть:

from extra import * 

Хотя это дает мне все определения в extra.py, когда, возможно, все, что я хочу, - это одно определение:

def gap():
    print
    print

Что мне добавить в оператор import, чтобы просто получить gap из extra.py?

Ответы [ 17 ]

1 голос
/ 04 декабря 2018

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

Структура каталогов:

/path/to/common_dir/module/file.py
/path/to/common_dir/application/app.py
/path/to/common_dir/application/subpath/config.json

В app.py добавьте путь клиента к sys.path:

import os, sys, inspect

sys.path.append(os.getcwd())
from module.file import MyClass
instance = MyClass()

Необязательно (если вы загружаете, например, конфиги) (Inspect представляется наиболее надежным для моих случаев использования)

# Get dirname from inspect module
filename = inspect.getframeinfo(inspect.currentframe()).filename
dirname = os.path.dirname(os.path.abspath(filename))
MY_CONFIG = os.path.join(dirname, "subpath/config.json")

Run

user@host:/path/to/common_dir$ python3 application/app.py

Это решение работает для меня в cli, а также в PyCharm.

1 голос
/ 25 марта 2018

Просто для импорта файла Python в другой файл Python

Допустим, у меня есть helper.py Python-файл, который имеет функцию отображения, такую ​​как,

def display():
    print("I'm working sundar gsv")

Теперь в app.py вы можете использовать функцию отображения

import helper
helper.display()

Выход,

I'm working sundar gsv

ПРИМЕЧАНИЕ: Не нужно указывать расширение .py.

1 голос
/ 29 июля 2018

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

1 голос
/ 30 июня 2018

Вы также можете сделать это: from filename import something

пример: from client import Client Обратите внимание, что вам не нужно расширение .py .pyw .pyui.

0 голосов
/ 09 мая 2019

Одна очень неизвестная особенность Python - это возможность импорта zip файлов:

library.zip
|-library
|--__init__.py

Файл __init__.py пакета содержит следующее:

def dummy():
    print 'Testing things out...'

Мы можем написать другой скрипт, который может импортировать пакет из zip-архива. Необходимо только добавить zip-файл в sys.path.

import sys
sys.path.append(r'library.zip')

import library

def run():
    library.dummy()

run()
0 голосов
/ 28 апреля 2019

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

import os, importlib, sys

def callfunc(myfile, myfunc, *args):
    pathname, filename = os.path.split(myfile)
    sys.path.append(os.path.abspath(pathname))
    modname = os.path.splitext(filename)[0]
    mymod = importlib.import_module(modname)
    result = getattr(mymod, myfunc)(*args)
    return result

result = callfunc("pathto/myfile.py", "myfunc", arg1, arg2)
0 голосов
/ 21 августа 2018

Существует много способов, как указано выше, но я обнаружил, что я просто хочу импортировать содержимое файла и не хочу писать строки и строки и должен импортировать другие модули. Итак, я нашел способ получить содержимое файла, даже с точечным синтаксисом (file.property), а не объединять импортированный файл с вашим.
Прежде всего, вот мой файл, который я импортирую, data.py

    testString= "A string literal to import and test with"


Примечание: Вместо этого вы можете использовать расширение .txt.
В mainfile.py начните с открытия и получения содержимого.

    #!usr/bin/env python3
    Data=open('data.txt','r+').read()

Теперь у вас есть содержимое в виде строки, но попытка доступа к data.testString вызовет ошибку, так как data является экземпляром класса str, и даже если у него есть свойство testString, это не будет делать то, что вы ожидали.
Далее создайте класс. Например (каламбур), ImportedFile

    class ImportedFile:

И поместите это в него (с соответствующим отступом):

    exec(data)


И, наконец, переназначить data примерно так:

    data=ImportedFile()

И это все! Просто получите доступ к любому другому модулю, набрав print(data.testString), чтобы вывести на консоль A string literal to import and test with.
Если, однако, вы хотите эквивалент from mod import *, просто отбросьте класс, присвоение экземпляра и отмените exec.

Надеюсь, это поможет :)
-Benji

...