希望改进我的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建议?
答案 0 :(得分:1)
如果您想避免使用路径操作,则可以使用未知的.pth
功能来执行此操作。
sys.path
应该以包含主程序的目录开头,可以是名称,也可以是引用作为''。我假设导入mymodule
的文件不属于mypackage
,因此''输入对导入mymodule
没有用。
sys.path
应该以执行二进制文件的site-packages
目录结尾。这是添加包的正常位置。如果您不想将mypackage
移至site-packages
,则可以将后者扩展为mystuff.pth
。在其中放入一个mypackage
文件。它应该包含一行:包含 myprojects
的目录的路径。称之为mypackage
。然后myprojects
和site-packages
中的任何其他包都可以导入,就像它们位于F:/python
中一样。
.pth文件的一个优点是您可以将相同的副本放在多个site-packages目录中。例如,我在python.pth
中有多个项目。我安装了多个版本的Python。所以我将$("input[type=number]").keypress(function (e) {
var el = $(this);
var currentValue = el.val();
var char = String.fromCharCode(e.keyCode || e.which);
if (currentValue.length === 3) {
el.val(currentValue + char);
e.preventDefault();
el.next().focus();
} else if (currentValue.length >= 4) {
e.preventDefault();
}
})
包含在每个网站包中的那一行。
答案 1 :(得分:0)
最好的策略是将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
因为我们要在my_module
之前导入mypackage
,所以它会在之前执行与路径相关的代码,并且您的包将在路径中可用。
答案 2 :(得分:-1)
您可以使用importlib
模块(python 3.5)或imp
为python 2.7以编程方式加载mypackage.mymodule
。两者都有相同的目的:
用于实现import语句的机制
这个问题可能对您有所帮助: How to import a module given the full path?