如何将自定义模块中包含的模块导入python交互环境的命名空间?

2024-06-02 06:30:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写以下模块myinit.py:

import os
import numpy as np
import pandas as pd
import datetime

并将其复制到搜索路径中

sudo cp init.py  /usr/local/lib/python3.5/dist-packages/myinit.py

现在,在cmd中使用python进入我的python交互环境

import myinit
dir(pd)
NameError: name 'pd' is not defined
dir(pandas)
NameError: name 'pandas' is not defined
dir(myinit.pd)
<module 'pandas' from '/usr/local/lib/python3.5/dist-packages/pandas/__init__.py'>

在我当前的python cmd环境中,我有两种方法来调用pandas

  1. myinit.pd调用它

  2. 在当前python cmd环境中输入import pandas as pd,然后用pd调用它

它们都让我感到不舒服,在当前的python名称空间中没有os, np ,pd ,datetime。 如何用自己的名称调用自定义模块导入的模块


Tags: 模块pyimportcmdpandasdatetime环境init
1条回答
网友
1楼 · 发布于 2024-06-02 06:30:31

import myinit导入整个myinit模块,但它只向本地名称空间添加一个名称:myinit

现在,myinit本身可能包含pdnposdatetime(以及您在其中定义的任何变量/函数),但它们在myinit中。因此,要访问它们,我们需要

import myinit
dir(myinit.pd)
# <module 'pandas' from '/usr/local/lib/python3.5/dist-packages/pandas/__init__.py'>

本质上,名称空间是这样嵌套的。我们使用点表示法从一个名称空间下降到另一个名称空间(例如pandas有自己的名称空间,pandas.DataFrame有自己的名称空间,等等)

您可以使用from从不同模块导入特定名称

from myinit import pd
dir(pd)
<module 'pandas' from '/usr/local/lib/python3.5/dist-packages/pandas/__init__.py'>
dir(os)
# error - we didn't import os, only pd

而且,将不同模块中包含的每个名称导入本地名称空间的方法(您似乎正在尝试这样做)是使用星号:

from myinit import *
dir(pd)
dir(os)
...

尽管您可以做到这一点,但您不应该按照PEP22“显式优于隐式”,并且您应该清楚地知道您在给定导入中使用的名称


顺便说一下,不要担心在两个不同的文件中两次导入相同的模块(比如pandas)。它只会加载到内存中一次sys模块包含整个程序中以前加载的模块的缓存,如果您尝试加载程序中以前加载过的任何模块,它只会从该缓存中选取相同的引用,而不是加载一个全新的实例

在程序中的多个文件中导入pandas、或os或几乎任何其他模块都是更好的代码样式,因为这样可以更清楚地了解您使用的工具以及它们的来源

相关问题 更多 >