gpt4 book ai didi

python - 如何将python文件中导入的库导入到另一个python文件中?

转载 作者:行者123 更新时间:2023-12-05 01:13:01 26 4
gpt4 key购买 nike

我有两个 python 文件。我正在使用其中一个来导入所有必备库。我正在使用另一个来执行一些代码。这是第一个名为 imports.py 的 python 文件

def importAll(process):

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
print('Success')
if process == 'train':
import sklearn

第二个python文件train.py如下:

from imports import  importAll
importAll('train')


def load_data(date):
#load only data till Sep
df = pd.read_csv('df.csv')
return(df[df['date'] < date])


date = '2012-09-01'
df = load_data(date)

当我运行 train.py 时,请注意正在打印“Success”(来自 imports.py 文件)但是,我也得到了 pd 未定义的错误(在 df = pd.read_csv('df.csv') 行中)有没有办法纠正这个错误?

最佳答案

当您从函数范围内导入时,该导入从该函数内定义,而不是在调用该函数的范围内。

我建议查看 this关于python中范围规则的一个很好的解释的问题。

要解决这个问题,您可以使用 python 的 star import

imports.py:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

__all__ = [
'pd',
'np',
'sns',
'plt'
]

train.py:

from imports import *

...

语法 from module import * 从该模块中导入 __all__ 列表中定义的所有变量。

编辑

我强烈反对使用此代码,因为它会产生与您预期相反的效果。这将消除冗余导入语句的“困惑”,但代价是更糟糕的事情:困惑的代码,以及等待浮出水面的隐藏错误(如下所述)。

唉,解决办法:

import inspect

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

CODE_CONTEXT = ['from imports import *\n']

__all__ = [
'pd',
'np',
'sns',
'plt'
]

def _get_filename():
frame, *_ = filter(
lambda frame: getattr(frame, 'code_context', None) == CODE_CONTEXT,
inspect.stack()
)
return frame.filename

imported_from = _get_filename()

if imported_from == 'train.py':
import sklearn
__all__.append('sklearn')

elif imported_from == 'eda.py':
...

要了解此代码可能产生的错误,请考虑以下示例:

imports.py:

import inspect

CODE_CONTEXT = ['from imports import *\n']

__all__ = []

def _get_filename():
frame, *_ = filter(
lambda frame: getattr(frame, 'code_context', None) == CODE_CONTEXT,
inspect.stack()
)
return frame.filename

imported_from = _get_filename()
print(imported_from)

a.py:

from imports import *

b.py:

from imports import *

ma​​in.py:

import a
import b

当你运行 python3 main.py 会在控制台打印什么?

一个.py

为什么不打印 b.py?因为模块只在第一次导入时执行一次。由于 a.py 首先导入了模块,以后每次导入 imports.py 都不会重新执行该模块,它们将重用在初始时构建的代码执行。

TLDR;

__all__ 所做的任何更改仅适用于模块的 第一个 导入,后续导入可能会缺少所需的模块。

关于python - 如何将python文件中导入的库导入到另一个python文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61038105/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com