为了改进我的Python风格,我在我的一个脚本上运行了一个PEP-8样式检查器,它抱怨一些我不知道如何修复的东西。脚本的开场白类似于:
#! /bin/env python3
import sys
import os
exe_name = os.path.basename(os.path.realpath(__file__))
bin_dir = os.path.dirname(os.path.realpath(__file__))
inst_dir = os.path.dirname(bin_dir)
sys.path.insert(0, inst_dir+'/path/to/packages')
import mypackage.mymodule样式检查器在import mymodule行上抱怨,声明它应该是文件的顶部。但很明显,在设置找到它的路径之前,我不能移动它。有没有一个很好的方法来实现这一点(我发现强制环境变量或shell包装器并不比我当前的代码更好),同时又遵守PEP-8建议?
发布于 2017-04-09 02:02:48
如果您希望避免路径操作,可以使用不为人所知的.pth功能来实现。
sys.path应该从包含主程序的目录开始,无论是通过名称还是通过引用'‘。我假设导入mymodule的文件不是mypackage的一部分,因此'‘条目对于导入mymodule没有什么用处。
sys.path应该以执行二进制文件的site-packages目录结束。这是添加包的正常位置。如果你不想把mypackage移到site-packages中,你可以通过在里面放一个mystuff.pth文件来“虚拟地”扩展后者。它应该包含一行:包含mypackage的目录的路径。叫它myprojects吧。然后,可以像在site-packages中一样导入mypackage和myprojects中的任何其他包。
.pth文件的一个优点是您可以将相同的副本放在多个站点包目录中。例如,我在F:/python中有多个项目。我安装了多个版本的Python。因此,我将包含这一行的python.pth放在了站点包中。
发布于 2017-04-03 23:52:46
最好的策略是将sys.path相关代码放在单独的文件中,并将其导入到工作代码文件中。
所以,我将把上面的代码分成两个文件。一个名为my_module.py,另一个名为working_module.py
现在,my_module将包含以下行
import sys
import os
exe_name = os.path.basename(os.path.realpath(__file__))
bin_dir = os.path.dirname(os.path.realpath(__file__))
inst_dir = os.path.dirname(bin_dir)
sys.path.insert(0, inst_dir+'/path/to/packages')而working_module将包含
import my_module
import mypackage.mymodule因为我们在导入mypackage之前导入了my_module,所以它将在前面执行与路径相关的代码,您的包将在path中可用。
发布于 2017-04-04 01:08:16
您可以使用importlib模块(Python3.5)或Python2.7的imp来编程加载mypackage.mymodule。两者都有相同的用途:
用于实现导入语句的
机制
这个问题可能对你更有帮助:How to import a module given the full path?
https://stackoverflow.com/questions/43188843
复制相似问题