Как импортировать внешний python файл в другой python файл? - PullRequest
0 голосов
/ 16 апреля 2020

Я хотел бы импортировать один файл python в другой, а затем скомпилировать основной файл. Как я могу это сделать?

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

n=5
fact = 1
if n < 0:
    print("Sorry, factorial does not exist for negative numbers")
elif n == 0:
    print("The factorial of 0 is 1")
else:
    for i in range(1,n + 1):
        fact = fact*i
    print "%d!=%d"%(n,fact)

Но я хотел бы создать дополнительный файл, скажем «auxfile.py», содержащий:

fact = 1
if n < 0:
    print("Sorry, factorial does not exist for negative numbers")
elif n == 0:
    print("The factorial of 0 is 1")
else:
    for i in range(1,n + 1):
        fact = fact*i
    print "%d!=%d"%(n,fact)

И другой основной файл, скажем «main.py», содержащий:

print "Required factorial is given below:"
for n in range(30): 
    import auxfile.py

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

Ответы [ 4 ]

0 голосов
/ 16 апреля 2020

Есть еще довольно уродливое решение: использовать встроенную функцию exec.

Прежде всего, вы читаете код из своего файла:

with open("auxiliary.py", 'r') as f:
    content = f.readlines()

Затем вы отфильтровываете ненужные строки, так что content - это строка, содержащая ваш код Python, то есть:

# The following evaluates to True
content == 'fact = 1\nif n < 0:\n    print("Sorry, factorial does not exist for negative numbers")\nelif n == 0:\n    print("The factorial of 0 is 1")\nelse:\n    for i in range(1,n + 1):\n        fact = fact*i\n    print "%d!=%d"%(n,fact)'

Затем вы можете просто вызвать функцию exec, который будет действовать так, как если бы строки были включены вместо вызова функции:

exec content # Or exec(content), both seems to work in Python 2.7

См. здесь для дальнейшего объяснения.

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

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

0 голосов
/ 16 апреля 2020

вы можете сделать это так:

auxfile.py

def factorial(n):
    fact = 1
    if n < 0:
        print("Sorry, factorial does not exist for negative numbers")
    elif n == 0:
        print("The factorial of 0 is 1")
    else:
        for i in range(1,n + 1):
            fact = fact*i
            print "%d!=%d"%(n,fact)

в вашем main.py:

from auxfile import factorial

print "Required factorial is given below:"
for n in range(30): 
    factorial(n)
0 голосов
/ 16 апреля 2020

Если вы пытаетесь избежать использования функции - может быть, вы могли бы заключить весь код в форму для l oop? Если это не так просто, как for-l oop, возможно, вы могли бы скопировать ваш основной код в другой файл над ним.

Например: До:

file1: "Your main code that wants to call the code below"
file2: "Your code that is too cumbersome to convert to a function"

После:
file1:

"Your main code that wants to call the code below"
 for n in range(30):
     "Your code that is too cumbersome to convert to a function"
0 голосов
/ 16 апреля 2020

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

Например, если вы хотите импортировать happy.py to sad.py просто сделайте:

import happy

Это даст следующий возврат (посмотрите на пример ниже):

Hello

Хотя это мгновенно запустит все за пределами любых циклов def в .py файле. Поэтому, если вы хотите запустить в файле единственную def l oop, используйте следующий код:

Пример содержимого happy.py:

print("Hello")
def okay():
    print("okay")

Если вы это сделали:

happy.okay()

Это даст вам следующую трассировку:

Hello
okay

СОВЕТ ДЛЯ ВАШЕГО КОДА В MAIN.PY: Вы сделали:

print «Необходимый факториал указан ниже:», тогда как вы забыли скобки. Вы должны использовать: print("Required factorial is given below:") Это позволит избежать будущих ошибок!

Надеюсь, это поможет!

...