![](/img/trans.png)
[英]Python: How to setup cx_Freeze script when located in different folder than main script?
[英]Python: How to choose one of multiple scripts as a package to import into a main script, when located in different directories?
我有多个项目都需要一个通用脚本 ( main.py
),但我需要它们具有特定于每个项目的不同功能。 这意味着当我运行脚本以在项目 A 中使用时,我希望能够导入其configA.py
,但在为项目 B 运行它时导入configB.py
。
例如,假设在configA.py
和configB.py
,同一个函数foo()
有不同的定义。 我的目标是能够沿着python3 main.py ../../ProjectA/Config/configA.py
为项目 A 运行一些东西,对于 B 类似。然后在main.py
,脚本将导入文件传递给它(类似于config = import_module(sys.argv[0])
),然后能够运行config.foo()
,它的行为会根据传递的文件而有所不同。
通过阅读有关 SO 的许多帮助帖子,我看到很多人建议使用importlib.import_module()
,因为我可以将包名作为参数传递给main.py
。 但是与我读过的这些其他帖子相比,稍微复杂一点是与我的文件结构有关。 似乎import_module()
仅当主/包文件位于同一目录中时才真正起作用,或者当主脚本位于包的父目录中时。 但是,我的文件结构如下所示:
└─ Documents
├─ Common
│ └─ Scripts
│ └─ main.py
├─ ProjectA
│ └─ Config
│ └─ configA.py
└─ ProjectB
└─ Config
└─ configB.py
鉴于此文件结构,有没有办法让我能够导入我选择的包以在main.py
使用?
您可以对不同的导入使用 if 语句:
import os
import sys
sys.path.insert(0, os.abspath('../..')) # this is important so the packages are on the path
if sys.argv[1] == 'A':
from ProjectA.Config.configA import foo
elif sys.argv[1] == 'B':
from ProjectB.Config.configB import foo
else:
raise ImportError(f'No module corresponding to {sys.argv[1]}')
或者你也可以使用importlib.import_module
而不是if/else
链:
import importlib
module = importlib.import_module('Project{x}.Config.config{x}'.format(x=sys.argv[1]))
foo = module.foo
然后使用通过
python main.py A # use foo from configA
python main.py B # use foo from ConfigB
-m
从Documents
运行修改sys.path
的另一种方法是通过Documents
目录中的-m
开关运行main.py
运行python main.py
,脚本的目录将放在路径上。 当运行python -m Common.Scripts.main
,当前工作目录将被放置在路径上,因此ProjectA
和ProjectB
是自动可发现的:
$ pwd
/path/to/Documents
$ python -m Common.Scripts.main
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.