我不确定是否有可靠的方法来确定这一点。事实上,我会建议你不要这样测试路径,因为你可能遇到不同的操作系统或环境中的特殊情况。
有几个备选方案,我建议改为:
1)如果这是一个命令行工具,我建议允许通过一个命令行标志,自定义配置文件配置的加载:
from argparse import ArgumentParser
import sys
import json
parser = ArgumentParser(description='...')
parser.add_argument('-c', '--config', default='config.json')
def main(argv):
args = parser.parse_args(argv)
print('loading config file:', args.config)
with open(args.config, 'r') as config:
config = json.loads(config.read())
print('loaded config', config)
# TODO do something with the config
if __name__ == '__main__':
main(sys.argv[1:])
运行带:python3 test1.py -c config-dev.json
2)如果这不是一个CLI应用程序,你可以实现通过USI类似的事情NG环境变量:
与
import os
import json
os.environ.get('CONFIG', 'config.json')
def main():
config_file = os.environ.get('CONFIG', 'config.json')
print('loading config file:', config_file)
with open(config_file, 'r') as config:
config = json.loads(config.read())
print('loaded config', config)
# TODO do something with the config
if __name__ == '__main__':
main()
运行:CONFIG=config-dev.json python3 test2.py
,或:
export CONFIG=config-dev.json
python3 test2.py
你也可以做一个shell脚本,以帮助设置你的开发环境,我们称之为customenv
:
source env/bin/activate
export CONFIG=config-dev.json
然后你可以使用这个文件来激活开发环境:
source customenv
3)如果你真的想在你的开发环境代码的特殊情况下,可以通过环境变量也指定此:
import os
is_dev_mode = 'MY_APP_DEV' in os.environ and os.environ['MY_APP_DEV'] == '1'
if is_dev_mode:
print('dev mode!')
运行与MY_APP_DEV=1 python3 test3.py
,或:
export MY_APP_DEV=1
python3 -m test3.py
4)更多定制:
import os
app_mode = os.environ.get('MY_APP_MODE', 'prod')
print(app_mode)
听起来不错;-)'pkg_resources.working_set'软件包的名称('import pkg_name')或库名称(如setup.py中的'name =“lib_name”)的密钥? –
这些键最终会成为“规范化”的软件包名称(所以对于'yaml'你会寻找'pyyaml',对于'pre_commit'你会寻找'pre-commit')。规范化规则遵循https://www.python.org/dev/peps/pep-0440/(PEP440)(尽管通常它最终是'.replace('_',' - ')。lower()') –
@LaurentLAPORTE你对这个问题还有其他问题吗? –