如何在Python中导入文件?我想导入:
文件(例如file.py) 一个文件夹 在运行时根据用户输入动态地生成文件 文件的特定部分(例如,单个函数)
如何在Python中导入文件?我想导入:
文件(例如file.py) 一个文件夹 在运行时根据用户输入动态地生成文件 文件的特定部分(例如,单个函数)
importlib被添加到Python 3中以编程方式导入模块。
import importlib
moduleName = input('Enter module name:')
importlib.import_module(moduleName)
应该从moduleName中删除.py扩展名。该函数还为相对导入定义了一个包参数。
在python 2.x中:
只需导入文件,不带.py扩展名 通过添加一个空的__init__.py文件,可以将文件夹标记为包 你可以使用__import__函数,它将模块名(不带扩展名)作为字符串扩展名
pmName = input('Enter module name:')
pm = __import__(pmName)
print(dir(pm))
输入help(__import__)获取更多详细信息。
将python文件从一个文件夹导入到另一个文件夹的复杂方法并不多。只需要创建一个__init__.py文件来声明这个文件夹是一个python包,然后转到你想要导入的主机文件
从root。parent。folder。file导入变量,类,等等
在“运行时”导入一个已知名称的特定Python文件:
import os
import sys
...
scriptpath = "../Test/"
# Add the directory containing your module to the Python path (wants absolute paths)
sys.path.append(os.path.abspath(scriptpath))
# Do the import
import MyModule
导入python文件的方法有很多种,各有优缺点。
不要匆忙地选择第一个适用于您的导入策略,否则当您发现它不能满足您的需求时,您将不得不重写代码库。
我将从解释最简单的示例#1开始,然后转向最专业和最健壮的示例#7
例1,使用python解释器导入python模块:
把它放到/home/el/foo/fox.py: def what_does_the_fox_say (): 打印(“狐狸精”) 进入python解释器: el@apollo: / home / el / foo $ python Python 2.7.3(默认,Sep 26 2013, 20:03:06) >>> import fox > > > fox.what_does_the_fox_say () 狐狸精哭 >>> 您通过python解释器导入了fox,从fox.py中调用了python函数what_does_the_fox_say()。
例2,在脚本中使用execfile或(Python 3中的exec)来执行另一个Python文件:
把它放在/home/el/foo2/mylib.py: def moobar (): 打印(“嗨”) 把它放在/home/el/foo2/main.py中: execfile(“/ home / el / foo2 / mylib.py”) moobar () 运行文件: el@apollo:/home/el/foo$ python main.py 嗨 函数moobar从mylib.py导入,并在main.py中可用
例3,使用from…进口…功能:
把它放在/home/el/foo3/chekov.py: def问题(): 打印“核舰艇在哪里?” 把它放在/home/el/foo3/main.py中: 从契科夫进口问题 问题() 像这样运行它: el@apollo:/home/el/foo3$ python main.py 核潜艇在哪里? 如果你在chekov.py中定义了其他函数,它们将不可用,除非你导入*
例4,如果riaa.py位于不同的文件位置,则导入它
把它放到/home/el/foo4/stuff/riaa.py: def监视(): 打印“计算机正在转变为人类的套索和枷锁” 把它放在/home/el/foo4/main.py中: 导入系统 进口操作系统 sys.path.append (os.path.abspath(“/ home / el / foo4 /东西”)) 从riaa进口* 留神观察() 运行该程序: el@apollo:/home/el/foo4$ python main.py 计算机正在变成人类的绞索和枷锁 它从不同的目录导入外部文件中的所有内容。
例5,使用os。系统(“python yourfile.py”)
import os
os.system("python yourfile.py")
例6,通过装载python startuphook导入你的文件:
更新:此示例过去适用于python2和3,但现在只适用于python2。Python3摆脱了这个用户startuphook特性集,因为它被低技能的python库作者滥用,使用它不礼貌地将他们的代码注入到全局名称空间,在所有用户定义的程序之前。如果您想让它在python3中工作,就必须更有创造性。如果我告诉你怎么做,python开发人员也会禁用该功能集,所以你只能靠自己了。
参见:https://docs.python.org/2/library/user.html
将这段代码放到主目录~/.pythonrc.py中
class secretclass:
def secretmessage(cls, myarg):
return myarg + " is if.. up in the sky, the sky"
secretmessage = classmethod( secretmessage )
def skycake(cls):
return "cookie and sky pie people can't go up and "
skycake = classmethod( skycake )
把这段代码放到你的main.py(可以在任何地方):
import user
msg = "The only way skycake tates good"
msg = user.secretclass.secretmessage(msg)
msg += user.secretclass.skycake()
print(msg + " have the sky pie! SKYCAKE!")
运行它,你应该得到这个:
$ python main.py
The only way skycake tates good is if.. up in the sky,
the skycookie and sky pie people can't go up and have the sky pie!
SKYCAKE!
如果你在这里得到一个错误:ModuleNotFoundError:没有名为'user'的模块,那么这意味着你正在使用python3,启动钩子默认是禁用的。
这篇文章的出处是:https://github.com/docwhat/homedir-examples/blob/master/python-commandline/.pythonrc.py请把你的小船送上来。
例7,最健壮的:在python中使用bare Import命令导入文件:
Make a new directory /home/el/foo5/ Make a new directory /home/el/foo5/herp Make an empty file named __init__.py under herp: el@apollo:/home/el/foo5/herp$ touch __init__.py el@apollo:/home/el/foo5/herp$ ls __init__.py Make a new directory /home/el/foo5/herp/derp Under derp, make another __init__.py file: el@apollo:/home/el/foo5/herp/derp$ touch __init__.py el@apollo:/home/el/foo5/herp/derp$ ls __init__.py Under /home/el/foo5/herp/derp make a new file called yolo.py Put this in there: def skycake(): print "SkyCake evolves to stay just beyond the cognitive reach of " + "the bulk of men. SKYCAKE!!" The moment of truth, Make the new file /home/el/foo5/main.py, put this in there; from herp.derp.yolo import skycake skycake() Run it: el@apollo:/home/el/foo5$ python main.py SkyCake evolves to stay just beyond the cognitive reach of the bulk of men. SKYCAKE!! The empty __init__.py file communicates to the python interpreter that the developer intends this directory to be an importable package.
如果你想看我关于如何在一个目录下包含所有.py文件的帖子,请参阅这里:https://stackoverflow.com/a/20753073/445131
导入文件..——参考链接
需要__init__.py文件来使Python将目录视为包含包,这样做是为了防止具有通用名称的目录,如string,在无意中隐藏了模块搜索路径中稍后出现的有效模块。
__init__.py可以只是一个空文件,但它也可以执行包的初始化代码或设置__all__变量。
mydir/spam/__init__.py
mydir/spam/module.py
import spam.module
or
from spam import module
导入.py文件的最佳方法是使用__init__.py。最简单的方法是在你的.py文件所在的目录下创建一个名为__init__.py的空文件。
Mike Grouchy的这篇文章很好地解释了__init__.py及其用于制作、导入和设置python包的用法。
from file import function_name ######## Importing specific function
function_name() ######## Calling function
and
import file ######## Importing whole package
file.function1_name() ######## Calling function
file.function2_name() ######## Calling function
以下是我现在已经理解的两种简单方法,确保你想导入的“file.py”文件只存在于你的当前目录中。
只是在另一个python文件中导入python文件
假设我有一个help .py python文件,它有一个显示函数,
def display():
print("I'm working sundar gsv")
在app.py中,你可以使用display函数,
import helper
helper.display()
输出,
我正在工作,桑达gsv
注意:不需要指定.py扩展名。
我想补充一点,我在其他地方不太清楚;在模块/包中,当从文件中加载时,模块/包名必须以mymodule作为前缀。想象我的模块是这样布局的:
/main.py
/mymodule
/__init__.py
/somefile.py
/otherstuff.py
当从__init__.py加载somefile.py/otherstuff.py时,内容应该如下所示:
from mymodule.somefile import somefunc
from mymodule.otherstuff import otherfunc
有很多方法,如上所述,但我发现我只想导入文件的内容,而不希望必须写一行又一行,必须导入其他模块。因此,我想出了一种方法来获取文件的内容,甚至使用点语法(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()
现在您有了字符串形式的内容,但是正在尝试访问数据。testString将导致一个错误,因为data是str类的一个实例,即使它确实有一个属性testString,它也不会执行您所期望的操作。 接下来,创建一个类。例如(双关语),ImportedFile
class ImportedFile:
然后把这个放进里面(用合适的缩进):
exec(data)
最后,像这样重新分配数据:
data=ImportedFile()
就是这样!就像访问任何其他模块一样,输入print(data.testString)将打印到控制台一个字符串文字,用于导入和测试。 然而,如果你想要从mod import *中获得等效的效果,只需删除类、实例赋值和删除exec即可。
希望这对你有所帮助。 石磊
如果你想导入的模块不在子目录中,那么尝试以下方法并从最深的公共父目录运行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。
这就是我从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)
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()
第一个案例 你想导入文件A.py到文件B.py中,这两个文件在同一个文件夹中,就像这样:
.
├── A.py
└── B.py
你可以在文件B.py中这样做:
import A
or
from A import *
or
from A import THINGS_YOU_WANT_TO_IMPORT_IN_A
然后你就可以在B.py文件中使用A.py文件中的所有函数了
第二个案例 你想导入B.py文件中的/A.py文件夹,这两个文件不在同一个文件夹中,就像这样:
.
├── B.py
└── folder
└── A.py
你可以在文件B.py中这样做:
import folder.A
or
from folder.A import *
or
from folder.A import THINGS_YOU_WANT_TO_IMPORT_IN_A
然后你就可以在B.py文件中使用A.py文件中的所有函数了
总结
在第一种情况下,a .py文件是您在B.py文件中导入的模块,您使用了import module_name语法。 在第二种情况下,文件夹是包含模块A.py的包,您使用导入package_name.module_name语法。
有关包和模块的更多信息,请参阅此链接。
有几种方法可以将python脚本包含在abc.py中
例如,如果你的文件名为abc.py(导入abc) 限制是你的文件应该和你调用的python脚本在同一个位置。
进口美国广播公司
例如,如果你的python文件在Windows文件夹中。Windows文件夹与调用python脚本的位置相同。
从文件夹导入ABC
在情况下abc.py脚本是可用的内部internal_folder,是在文件夹内
导入ABC
正如James上面所回答的,如果你的文件在某个固定的位置
进口操作系统 导入系统 scriptpath = "../Test/MyModule.py" sys.path.append (os.path.abspath (scriptpath)) 进口MyModule里
如果你的python脚本更新了,你不想上传-使用这些语句自动刷新。好处:)
%load_ext autoreload
%autoreload 2
如果函数定义在x.py文件中:
def greet():
print('Hello! How are you?')
在导入函数的文件中,这样写:
from x import greet
如果您不希望导入文件中的所有函数,这是非常有用的。
from y import *
假设你有一个文件x和y。 你想把y文件导入x。
然后转到您的x文件并放置上述命令。为了测试这一点,只需在y文件中放入一个打印函数,当导入成功时,在x文件中应该打印它。
使用Python 3.5或更高版本时,可以使用importlib。Util可以直接将.py文件作为模块导入任意位置,而不需要修改sys.path。
import importlib.util
import sys
def load_module(file_name, module_name)
spec = importlib.util.spec_from_file_location(module_name, file_name)
module = importlib.util.module_from_spec(spec)
sys.modules[module_name] = module
spec.loader.exec_module(module)
return module
参数file_name必须为字符串或类路径对象。module_name参数是必需的,因为所有加载的Python模块都必须有一个(点)模块名(如sys、importlib或importlib.util),但您可以为这个新模块选择任何可用的名称。
你可以这样使用这个函数:
my_module = load_module("file.py", "mymod")
在使用load_module()函数将该模块导入Python进程一次之后,就可以使用给定的模块名导入该模块。
file.py:
print(f"file.py was imported as {__name__}")
one.py:
print(f"one.py was imported as {__name__}")
load_module("file.py", "mymod")
import two
two.py:
print(f"two.py was imported as {__name__})")
import mymod
对于上面的文件,您可以运行以下命令来查看file.py如何变得可导入。
$ python3 -m one
one.py was imported as __main__
two.py was imported as two
file.py was imported as mymod
这个答案基于官方的Python文档:
import sys
#print(sys.path)
sys.path.append('../input/tokenization')
import tokenization
要导入任何.py文件,可以使用上面的代码。
首先追加路径,然后导入
注:“. ./input/tokenization'目录中包含tokenization.py文件
这帮助我用Visual Studio Code构建我的Python项目。
当你没有在目录中声明__init__.py时,可能会导致这个问题。目录变成隐式的名称空间包。下面是关于Python导入和项目结构的一个很好的总结。
另外,如果你想使用顶部栏中的Visual Studio Code运行按钮,脚本不在主包中,你可以尝试从实际目录运行控制台。
例如,你想要从测试包中执行一个打开的test_game_item.py,并且你有Visual Studio Code在省略(主包)目录中打开:
├── omission
│ ├── app.py
│ ├── common
│ │ ├── classproperty.py
│ │ ├── constants.py
│ │ ├── game_enums.py
│ │ └── __init__.py
│ ├── game
│ │ ├── content_loader.py
│ │ ├── game_item.py
│ │ ├── game_round.py
│ │ ├── __init__.py
│ │ └── timer.py
│ ├── __init__.py
│ ├── __main__.py
│ ├── resources
│ └── tests
│ ├── __init__.py
│ ├── test_game_item.py
│ ├── test_game_round_settings.py
│ ├── test_scoreboard.py
│ ├── test_settings.py
│ ├── test_test.py
│ └── test_timer.py
├── pylintrc
├── README.md
└── .gitignore
目录结构来自[2]。
你可以试着这样设置:
(Windows) Ctrl + Shift + P→Preferences: Open Settings (JSON)。
将这一行添加到用户设置中:
"python.terminal.executeInFileDir": true
对于其他系统,更全面的答案也在这个问题中。