不,没有,按设计.如果要在导入子模块时避免太多开销,只需使用空__init__.py
s来定义包.以这种方式,导入包的开销几乎为零.
如果pandas
不这样做,你无法导入pandas.util.clipboard
而无需导入pandas
和util
第一个.您可以做什么,但它是一个巨大的黑客,它不相同,是将clipboard
模块导入为普通模块而不是作为子模块.您只需找到pandas
安装位置(例如/usr/lib/pythonX.Y/dist-packages/
)并在sys.path
(/usr/lib/pythonX.Y/dist-packages/pandas/util
在您的情况下)插入父包的路径.然后您可以clipboard
通过执行以下操作导入包:
import clipboard
Run Code Online (Sandbox Code Playgroud)
但请注意:
import clipboard
from pandas.util import clipboard as clipboard2
print(clipboard == clipboard2)
Run Code Online (Sandbox Code Playgroud)
会打印False
.事实上,这样做可能会破坏很多代码,因为你从根本上打破了import
机制假设的一些不变量.
特别是,如果子模块做参考的其他子模块使用相对导入,导入将失败,并有在那里将无法正常使用的其他情形.失败的另一个例子是你必须处理腌制对象.如果您使用导入的模块对某些对象进行了腌制,pandas.util.clipboard
那么您将无法使用clipboard
上面导入的模块对其进行去除.
总之,不要!我建议要么:
pandas.util.clipboard
而不是其他的pandas
,你可能不应该pandas
首先使用,你应该使用只实现其功能的较小的包clipboard
.如果您查看pandas.util.clipboard
源代码,您会发现它实际上只是pyperclip
模块版本1.3.您可以在您的模块中添加此模块,site-packages
而不是使用它提供的模块pandas
.事实上,pandas
团队只在源代码的末尾添加了以下部分:
## pandas aliases
clipboard_get = paste
clipboard_set = copy
Run Code Online (Sandbox Code Playgroud)
扩展一下为什么 python导入以这种方式工作.
正如您所知,在python 模块中是对象.而且包也是模块,尽管不是每个模块都是一个包.导入包时,如下所示:
import pandas.util.clipboard
Run Code Online (Sandbox Code Playgroud)
Python必须:
module
实例pandas
module
实例util
并将其作为属性添加到pandas
module
实例clipboard
并将其作为属性添加到util
.为了创建module
实例,python 必须执行模块中的代码.
表格的进口:
from pandas.util import clipboard
Run Code Online (Sandbox Code Playgroud)
只是语法糖:
import pandas.util.clipboard
clipboard = pandas.util.clipboard
del pandas.util
Run Code Online (Sandbox Code Playgroud)
请注意,在这种from
情况下clipboard
可以是module
/ package或只是内部定义的东西util
.为了检查这一点,解释器还必须导入util
并执行此操作,它还必须导入pandas
.
sys.meta_path
我找到了一种用于挂钩导入过程的方法:
import imp, sys
class DummyLoader(object):
def load_module(self, name):
names = name.split("__")
path = None
for name in names:
f, path, info = imp.find_module(name, path)
path = [path]
return imp.load_module(name, f, path[0], info)
def find_module(self, name, path=None):
if "__" in name and not name.startswith("__"):
return DummyLoader()
else:
return None
if not sys.meta_path:
sys.meta_path.append(DummyLoader())
else:
sys.meta_path[0] = DummyLoader()
Run Code Online (Sandbox Code Playgroud)
使用“__”而不是“.” 仅用于加载文件:
import pandas__util__clipboard as clip
Run Code Online (Sandbox Code Playgroud)
或使用函数加载文件:
import imp
def load_module(name):
names = name.split(".")
path = None
for name in names:
f, path, info = imp.find_module(name, path)
path = [path]
return imp.load_module(name, f, path[0], info)
clip = load_module("pandas.util.clipboard")
Run Code Online (Sandbox Code Playgroud)