#include在Python中,但实际上仅包括

时间:2019-02-21 15:39:50

标签: python include

我想问: 有什么办法(在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连接和类似数据的定义变量,这是更多脚本所共有的。

2 个答案:

答案 0 :(得分:1)

导入模块时,将执行导入模块的全局范围内的所有操作,包括语句,变量定义,类定义等。

例如,如果我要修改您的mysum.py

a = 1
b = 4
def some_func(a,b):
    return a+b

然后在另一个脚本中运行

import mysum

所有这些语句将被执行。我可以访问mysum.amysum.bmysum.some_func,因为它们是在导入时执行的。您的c = a+b的行为完全相同

现在让我们按需检查脚本:

c = a+b

重要的是,即使正在导入它,也要将其视为独立脚本。在该脚本的整个作用域中都没有定义 ab,因此在导入时,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)

您会发现我没有像

那样使用ab的全局样式调用
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?

上的答案