Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按文件名加载python脚本源以进行测试_Python_Python 3.x_Python Import - Fatal编程技术网

按文件名加载python脚本源以进行测试

按文件名加载python脚本源以进行测试,python,python-3.x,python-import,Python,Python 3.x,Python Import,我想为一个名为foobar的python 3.7+脚本创建一个测试(这是文件名,没有.py扩展名): #/usr/bin/env python def foo(巴): 返回条+42 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': 印刷(foo(1)) 如何仅通过路径加载此文件,以便测试foo()方法?测试不应触发if main条件 更新注意,这不是关于执行测试中的文件(即exec('foo-bar')),而是将其作为模块/资源加载/导入,允许测试代码在其

我想为一个名为
foobar
的python 3.7+脚本创建一个测试(这是文件名,没有
.py
扩展名):

#/usr/bin/env python
def foo(巴):
返回条+42
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
印刷(foo(1))
如何仅通过路径加载此文件,以便测试
foo()
方法?测试不应触发
if main
条件


更新注意,这不是关于执行测试中的文件(即
exec('foo-bar')
),而是将其作为模块/资源加载/导入,允许测试代码在其上执行
foo()

我认为,您可以做的是临时创建扩展名为的文件副本。py,导入后删除它

我认为,您可以做的是临时创建扩展名为的文件副本。导入py并将其删除后,可以使用中的函数直接从脚本文件加载此模块,而无需扩展名
.py

要使其工作,您需要显式地使用加载程序,在这种情况下,它将工作

from importlib.machinery import SourceFileLoader

foo_bar = SourceFileLoader('foo_bar', './foo-bar').load_module()
此时,您可以使用模块内部的功能:

result = foo_bar.foo(1)
assert result == 43

您可以使用中的函数直接从脚本文件加载此模块,而无需扩展名
.py

要使其工作,您需要显式地使用加载程序,在这种情况下,它将工作

from importlib.machinery import SourceFileLoader

foo_bar = SourceFileLoader('foo_bar', './foo-bar').load_module()
此时,您可以使用模块内部的功能:

result = foo_bar.foo(1)
assert result == 43

为什么希望Python文件没有扩展名
.py
呢?1)此代码已经存在,因此向后兼容2)这是一个实用程序,与任何其他命令一样,它的语言是一个实现细节,不应向该实用程序的用户公开(你不在乎你的
ls
是用c还是go写的,对吧?可以用符号链接来完成,但这样会创建两个文件而不是一个-太复杂了。@DYZ这不是一个dup-我不是在执行代码,我需要
加载它。我认为你把它标记为dup是错误的(是的,我在发布这篇文章之前看到了那篇文章)不,当然不是:)我所说的加载是指将其作为资源/代码加载,即可能使用
SourceFileLoader
——允许我使用类似反射的功能(用.NET的说法)——从而使调用
foo()成为可能
测试中的方法。是的,我在导入lib.util时遇到了相同的问题。
这对我很有效:
foo\u bar=imp.load\u模块('foo\u bar',f,'foo bar',('r',imp.PY\u源代码))
,将“foo bar”文件的文件对象作为
f
传递给它,但是
imp
模块已被弃用,建议改为
importlib.util
。。为什么您希望Python文件没有
.py
扩展名?1)此代码已经存在,因此向后兼容2)这是一个实用程序,与任何其他命令一样,它的语言是一个实现细节,不应该向实用程序的用户公开(你不在乎你的
ls
是用c还是go写的,对吧?可以用符号链接来完成,但这样会创建两个文件而不是一个-太复杂了。@DYZ这不是一个dup-我不是在执行代码,我需要
加载它。我认为你把它标记为dup是错误的(是的,我在发布这篇文章之前看到了那篇文章)不,当然不是:)我所说的加载是指将其作为资源/代码加载,即可能使用
SourceFileLoader
——允许我使用类似反射的功能(用.NET的说法)——从而使调用
foo()成为可能
测试中的方法。是的,我在导入lib.util时遇到了相同的问题。
这对我很有效:
foo\u bar=imp.load\u模块('foo\u bar',f,'foo bar',('r',imp.PY\u源代码))
,将“foo bar”文件的文件对象作为
f
传递给它,但
imp
模块已被弃用,建议改为
importlib.util
。。这对于测试框架来说不是一个好的解决方案。请参见上述注释-希望@filbranden会发布一个答案,或者我会在一天内自行回答。这不是一个好的解决方案对于测试框架来说,这是一个很好的解决方案。请看上面的评论-希望@filbranden会发布一个答案,或者我会在一天内自行回答。感谢您的帮助!不过您可能需要编辑一件事--它似乎是
foo_bar=SourceFileLoader('foo-bar','./foo bar')。load_module()
也同样有效,没有所有的规范内容,它让我可以直接调用
foo\u bar.foo(5)
。@Yurik这太简单了!谢谢你!谢谢你帮我弄明白了!不过你可能想编辑一件事——它似乎是
foo\u bar=SourceFileLoader('foo-bar','./foo-bar')。load\u module()
也能正常工作,没有所有的规范内容,它让我可以直接调用
foo\u bar.foo(5)
。@Yurik这太简单了!谢谢!