我有一个像下面的文件结构:
- 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
放在配置文件中,并将其作为外部脚本直接调用的文件(以及从那里调用的所有其他文件(。但是,我遇到了一个问题,当其他文件import config
时,它会导致导入循环,因为它们也是从config.py导入的。通常,我相信这是通过类似if __name__ == "__main__":
在config.py文件中进行一次导入来解决的(见下文(。这在我的情况下不起作用,并且脚本永远不会进入if
语句,可能是因为它被第三个程序调用为子例程,并且它不是主程序本身。因此,我无法强制执行部分代码,config.py只执行一次。
这就是我上面对config.py的意思(不适用于我的情况(:
... # Some parameter definitions
if __name__ == "__main__":
code_path = "Path\To\My\Project\"
import sys
sys.path.insert(0, code_path)
import main # Everything is then executed in main.py (where config.py is also cross-imported)
有没有办法强制执行上述if
中的代码部分,即使交叉导入也只执行一次,但不依赖于__name__ == "__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