Python 处理外部称为多文件脚本的导入

Python 处理外部称为多文件脚本的导入,python,Python,我的文件结构如下所示: code_path = "Path\\To\\My\\Project\\" import sys sys.path.insert(0, code_path) import config import some_other_file ... config.py main.py some_other_file.py 其中config.py包含易于访问的参数,但其他方面的代码不多。所有其他代码文件都应该可以访问这些文件。通常情况下,import-config可以,但在

我的文件结构如下所示:

code_path = "Path\\To\\My\\Project\\"
import sys
sys.path.insert(0, code_path)

import config
import some_other_file

...
  • config.py
  • main.py
  • some_other_file.py
其中config.py包含易于访问的参数,但其他方面的代码不多。所有其他代码文件都应该可以访问这些文件。通常情况下,
import-config
可以,但在这种情况下,python脚本是从另一个程序外部调用的,因此根调用目录与文件所在的目录不同(因此仅导入
import
会导致异常,因为它找不到文件)

现在,我的解决方案是在main.py文件(第三个程序直接调用的文件)中包含以下内容:

code_path = "Path\\To\\My\\Project\\"
import sys
sys.path.insert(0, code_path)

import config
import some_other_file

...
但是,这意味着每次移动代码时都必须修改main.py。我可以接受这一点,但我当然希望有一个简单的文件,包含所有必要的配置,而不需要深入研究其他文件(特别是因为代码可能会在以后传递给其他人,他们只是希望它尽可能轻松地工作)

我尝试在配置文件中插入
sys.path.insert
,并使其成为外部脚本直接调用的文件(以及从那里调用的所有其他文件)。但是,我遇到了一个问题,当其他文件执行导入配置时,会导致导入循环,因为它们也是从config.py导入的。通常,我认为这可以通过在config.py文件中只导入一次来解决,比如
if\uuuuu name\uuuu==“\uuuu main\uuuu”:
(见下文)。在我的例子中,这不起作用,脚本永远不会进入
if
语句,可能是因为它被第三个程序作为子程序调用,而不是主程序本身。因此,我无法强制config.py中的部分代码只执行一次。

这就是我在上面对config.py的意思(它不适用于我的案例):

有没有办法强制上面的
if
中的代码部分即使交叉导入也只执行一次,而不依赖
\uuuuuuu name\uuuuuuu==“\uuuuuu main”
?或者任何其他方法来处理这个问题,同时将所有参数和配置数据保存在一个简单的文件中

顺便说一句,我正在使用IronPython来实现这一点(不完全是一种选择),但由于我坚持希望使用非常简单的东西,我相信它对于所有python版本都是通用的


tl;dr:我想要一个带有一系列参数的config.py文件,包括程序所在的目录,可以被多个.py文件访问。我希望避免需要在“main”代码文件中写入项目目录,因为这应该是一个参数,因此在config.py中只有一个。整个过程都被传递给第三个外部程序并由第三个外部程序执行,因此这些文件所在的目录与调用它们的目录不同(因此,在导入不同文件时,必须将项目目录包含到系统路径中).

一种非常常见的可能的设计方案是依赖于使用单个文件配置的环境变量。然后,您的多程序系统将使用一些运行脚本启动,然后您的python应用程序将需要使用类似os.env[…]的内容来获取/设置/检查所需的变量。然后,您的目录将按照以下内容查看:

.
.
.
.env (environment variables - doesn't have to be called .env)
main.py
run.sh (starts system of programs - doesn't have to be called run.sh)
.
.
.
对于运行脚本,您可以“激活”环境变量,然后启动相关程序。如果使用bash作为终端:

source .env # "activate" your environment variables

# Then the command to start whatever you need to; for example
#
# python main.py
# or
# ./myprogram


非常感谢您的回复。难道没有办法只用python来解决这个问题吗?确保某些行(导入)只执行一次的某种方法,即使包含它们的脚本稍后交叉导入,但不依赖于
如果
中的。不仅仅是我试图避免使用bash脚本(事实也是如此),主程序还附带了一个IronPython解释器,因此它在内部处理所有python执行,我不确定环境变量是否可用。如果没有其他解决方法,我将尝试接受您的答案。@Arce11感谢您的后续跟进。Python导入执行一次,然后缓存。稍后导入同一模块时会引用缓存中的内容,因此您不需要手动检查并防止重复导入。好的!我刚刚测试过,你说得很对。我想我可以将脚本目录作为变量运行config.py,从那里导入main.py,即使main.py导入回config.py,它也不会循环导入。非常感谢你!