如何在完整路径下加载Python模块?请注意,该文件可以位于文件系统中的任何位置,因为它是一个配置选项.
如何根据相对路径导入Python模块?
例如,如果dirFoo包含Foo.py和dirBar,和dirBar包含Bar.py,我怎么导入Bar.py到Foo.py?
这是一个直观的表示:
dirFoo\
Foo.py
dirBar\
Bar.py
Run Code Online (Sandbox Code Playgroud)
Foo希望包括Bar,但重组文件夹层次结构不是一种选择.
我一直这样:
DeprecationWarning: integer argument expected, got float
Run Code Online (Sandbox Code Playgroud)
如何让这条消息消失?有没有办法避免Python中的警告?
我有一个名为foobar的文件(没有.py扩展名).在同一目录中,我有另一个试图导入它的python文件:
import foobar
Run Code Online (Sandbox Code Playgroud)
但这只有在我将文件重命名为foobar.py时才有效.是否可以导入没有.py扩展名的python模块?
更新:该文件没有扩展名,因为我也将它用作独立脚本,我不想输入.py扩展名来运行它.
Update2:我将选择下面提到的符号链接解决方案.
我有一个模块foo,包含util.py和bar.py.
我想在IDLE或python会话中导入它.我该怎么做?
我找不到关于如何导入不在当前目录或默认python PATH中的模块的文档.尝试后import "<full path>/foo/util.py",和from "<full path>" import util
我能得到的最接近的是
import imp
imp.load_source('foo.util','C:/.../dir/dir2/foo')
Run Code Online (Sandbox Code Playgroud)
这给了我在Windows 7上的权限被拒绝.
参考这个问题,我有一个类似但不一样的问题..
在我的路上,我将有一些文本文件,结构如下:
var_a: 'home'
var_b: 'car'
var_c: 15.5
Run Code Online (Sandbox Code Playgroud)
我需要python读取文件,然后创建一个名为var_a的变量,其值为'home',依此类推.
例:
#python stuff over here
getVarFromFile(filename) #this is the function that im looking for
print var_b
#output: car, as string
print var_c
#output 15.5, as number.
Run Code Online (Sandbox Code Playgroud)
这是否可能,我的意思是,即使保留var类型?
请注意,我对文本文件结构有完全的自由,如果我提议的那个不是最好的,我可以使用我喜欢的格式.
编辑:ConfigParser可以是一个解决方案,但我不喜欢它,因为在我的脚本中我将有时参考文件中的变量
config.get("set", "var_name")
Run Code Online (Sandbox Code Playgroud)
但我喜欢的是直接引用变量,就像我在python脚本中声明的那样......
有一种方法可以将文件导入为python字典吗?
哦,最后一点,请记住,我不确切知道文本文件中有多少变量.
编辑2:我对stephan的JSON解决方案非常感兴趣,因为通过这种方式,可以使用其他语言(PHP,然后通过AJAX JavaScript)简单地读取文本文件,但是在执行该解决方案时我失败了:
#for the example, i dont load the file but create a var with the supposed file content
file_content = "'var_a': 4, 'var_b': 'a string'"
mydict = dict(file_content)
#Error: ValueError: dictionary update …Run Code Online (Sandbox Code Playgroud) 如何根据Python的完整路径在Python 3.4中加载Python模块?
类似的问题如何在给定完整路径的情况下导入模块?涵盖了3.4之前的Python版本,但结论是Python 3.4中的支持已经弃用了所提出的答案,因此对于Python 3.4的任何解决方案都表示赞赏.
请注意,此问题不是Import abitrary python源文件的副本.(Python 3.3+),因为对此的回答也使用loader.load_module()了Python 3.4中不推荐使用的内容,如回答所述,详细介绍请考虑将importlib.abc.Loader.load_module()和文档放在importlib中.
因此,需要在Python 3.4中通过完整路径导入模块的支持解决方案.
每当我尝试在pycharm中使用"sklearn"时,我在控制台上收到以下错误.
DeprecationWarning:不推荐使用imp模块,而是使用importlib; 请参阅模块的文档以了解替代用途import imp
我不确定它是否应该打扰我,因为程序仍在工作,但它很烦人.我怎么能摆脱它?
我做了一切改变,人们在链接问题中推荐,但错误仍然存在.
谢谢
Python unittest模块似乎假设一个项目的目录结构,其中有一个项目根级目录,其中包含源代码和该目录下的测试.
但是,我想在我的~/bin目录中编写Python脚本并在另一个目录中测试它(比方说~/dev/tests).有没有办法让我使用命令行界面运行单元测试,而无需设置我的PYTHONPATH环境变量和创建__init__.py文件等等?
这是一个展示我想要的简单例子:
~/bin/candy:
#!/usr/bin/env python
def candy():
return "candy"
if __name__ == '__main__':
print candy()
Run Code Online (Sandbox Code Playgroud)
~/dev/tests/test_candy.py:
#!/usr/bin/env python
import unittest
import candy
class CandyTestCase(unittest.TestCase):
def testCandy(self):
candyOutput = candy.candy()
assert candyOutput == "candy"
Run Code Online (Sandbox Code Playgroud)
我注意到如果出现以下情况,可以很方便
candy.py和test_candy.py)我可以使用unittest模块运行python 来执行以下操作,而无需在我的环境中明确设置任何内容:
~/candy).test_candy有py作为扩展名.candy和test_candy.py不共享一个共同的根(我的主目录除外).如果通过简单的调用python -m unittest无法做到这一点,那么实现这一目标的最简单方法是什么?
如果有目录/home/project/aaa。我知道它是一个 Python 包。
那么,我如何通过知道它的路径来导入这个模块。
意味着,我希望代码有效:
aaa = load_module("/home/project/aaa")
Run Code Online (Sandbox Code Playgroud)
我知道的唯一方法是,添加/home/project到sys.path
但它可能会引起一些问题:
如果我添加/home/project到sys.path
如果pytest路径中有一个目录/home/project。
那么官方的 pytest 包将不起作用。
我试试吧importlib。但似乎importlib只能将文件作为模块导入,而不是路径。
所以,我试试看:
aaa = importlib.import_module("aaa", "/home/project")
Run Code Online (Sandbox Code Playgroud)
或者
aaa = importlib.import_module("aaa", "/home/project/aaa")
Run Code Online (Sandbox Code Playgroud)
他们两个都不工作。
那么,有没有其他方法可以做我想做的事?
哦,我正在使用 Python3.6
更新于 20170628
(注意:有一个__init__.pyin 文件夹/home/project/aaa)
我知道的所有解决方案都是从单个文件导入模块。
如果bbb.py文件夹中有文件/home/project/aaa
然后,添加/home/project/aaa到 sys.path或__path__(无论如何)
import bbb 工作,但不是 import aaa
我想问的是如何将文件夹(或目录)作为模块导入。
对于我的示例,文件夹aaa被视为一个模块。
我想用import aaa …
在我开发的Python系统中,我们通常有这个模块结构.
mymodule/
mymodule/mymodule/feature.py
mymodule/test/feature.py
Run Code Online (Sandbox Code Playgroud)
这允许我们的小测试框架轻松导入test/feature.py并运行单元测试.但是,我们现在需要一些shell脚本(用Python编写):
mymodule/
mymodule/scripts/yetanotherfeature.py
mymodule/test/yetanotherfeature.py
Run Code Online (Sandbox Code Playgroud)
yetanotherfeature.py由模块Debian软件包安装到/ usr/bin中.但我们显然不希望扩展.py扩展.所以,为了使测试框架仍然能够导入模块,我必须做这个符号链接的东西:
mymodule/
mymodule/scripts/yetanotherfeature
mymodule/scripts/yetanotherfeature.py @ -> mymodule/scripts/yetanotherfeature
mymodule/test/yetanotherfeature.py
Run Code Online (Sandbox Code Playgroud)
是否可以在Python中通过文件名导入模块,或者您能想到更优雅的解决方案吗?
python ×11
import ×2
python-3.x ×2
debian ×1
deprecated ×1
external ×1
ignore ×1
pycharm ×1
scikit-learn ×1
text-files ×1
unit-testing ×1
variables ×1
warnings ×1