我想问: 有什么办法(在Python中),如何绝对愚蠢地将其他文件包含到源代码中?没有像模块之类的任何舞蹈, 即等效于C中的#include? 对此存在很多问题,但所有问题都在打开导入模块。不,我只想将任何文件中的一些文本行插入到我的代码中,而无需对其进行预处理。
例如:
让我们的文件 mysum.py
c = a + b # there is just this one line
我想包含另一个源代码: 文件experiment.py:
#!/usr/bin/python
# -*- coding: UTF8 -*-
import importlib
import sys
import math
a = 1
b = 2
import **mysum**
print c
嗯,它不起作用,
Traceback (most recent call last):
File "./experiment.py", line 12, in <module>
import mysum
File "/home/rna/unix/mypok/mysum.py", line 5, in <module>
c = a + b
NameError: name 'a' is not defined
我真的需要一个简短的头文件来包含更多不同的脚本,其中会有关于MySQL连接和类似数据的定义变量,这是更多脚本所共有的。
答案 0 :(得分:1)
导入模块时,将执行导入模块的全局范围内的所有操作,包括语句,变量定义,类定义等。
例如,如果我要修改您的mysum.py
a = 1
b = 4
def some_func(a,b):
return a+b
然后在另一个脚本中运行
import mysum
所有这些语句将被执行。我可以访问mysum.a
,mysum.b
和mysum.some_func
,因为它们是在导入时执行的。您的c = a+b
的行为完全相同
现在让我们按需检查脚本:
c = a+b
重要的是,即使正在导入它,也要将其视为独立脚本。在该脚本的整个作用域中都没有定义 a
或b
,因此在导入时,c=a+b
会被求值,而这些变量都没有定义
我不确定您要执行的操作的确切用例,但是如果您想要某个函数添加两个变量,我会这样做:
#mysum.py
def some_add(a,b):
return a+b
#other_module.py
import mysum
a = 2
b = 3
c = mysum.some_add(a,b)
您会发现我没有像
那样使用a
和b
的全局样式调用
def some_add():
return a+b
因为再次要求a和b在该模块的全局范围内,因此您将再次获得NameErrors
答案 1 :(得分:0)
execfile
曾经在 Python 2 中执行此操作,但在 Python 3 中已被替换为:
exec(open('myfile.py').read())
这实际上只是读取该文件(在运行时),exec
就是结果。请注意,这与 C++ 所做的并不完全相同,即预处理器在文件运行(或编译)之前完成所有这些工作,但它可能是最接近它的事情。
如果你想让它成为某种可重用的功能,你可以这样做
import sys
def include(filename):
with open(filename, 'r') as f:
exec(f.read(), sys._getframe(1).f_globals, sys._getframe(1).f_locals)
include("myfile.py") # literally reads the file and evaluates it at runtime
对 exec(f.read(), sys._getframe(1).f_locals, sys._getframe(1).f_locals)
的调用意味着 exec
调用在父函数的作用域中运行。另请参阅 What is an alternative to execfile in Python 3?