为了设置一些路径来访问我的应用程序的子目录(如locale /),我在settings.py中使用它:
__process_name = os.path.basename(sys.argv[0])
__abspath = os.path.abspath(sys.argv[0])
__l1 = len(__process_name)
__l2 = len(__abspath)
rootdir = __abspath[:__l2-__l1]
然后,例如访问数据/:
datadir = rootdir + "data/"
问题是,当我运行这个settings.py时,我运行测试(例如python3 -m py.test),然后sys.argv [0]不再匹配myapp,测试脚本无法访问数据/.
我想知道如何处理这个问题,例如:
>有没有办法从我的应用程序和测试套件中获取相同的rootdir?
>或者,我应该仅为我的应用程序保留settings.py,并为测试套件提供正确的(硬编码)rootdir吗?
>或者在配置文件中定义一个installdir,它将在安装过程中设置,然后由我的应用程序(而不是上面的代码段)及其测试套件使用?
>我还想过用’myappname’替换sys.argv [0],但是,因为有不同的目录具有相同的名称,所以它不确定它是否正确. (另外,如果在另一个地方安装了一个版本和一个开发版本:如何区分它们呢?)
那么,处理这个问题的最佳方法是什么?
解决方法:
所以通常要做的是os.path.dirname(os.path.abspath(__ file__)).
__file__是当前模块的路径,os.path.abspath确保它是绝对的,os.path.dirname为您提供了它的目录部分.
如果您将模块作为包的一部分,并且需要例如包中的目录,您可以根据需要使用os.path.join(…,os.pardir),或者如果可能的话导入包(即__init__.py)并执行your_package .__ file__.
您可能还需要考虑的另一种方法是使用setuptools将数据指定为包数据,然后使用pkg_resources API来访问它.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。