尝试导入 Python 文件时可以使用破折号吗?
- 2025-02-28 08:24:00
- admin 原创
- 60
问题描述:
基本上当我有一个像这样的python文件时:
python-code.py
并使用:
import (python-code)
解释器给出语法错误。
有什么想法可以解决此问题吗?python 文件名中的破折号是否不合法?
解决方案 1:
您应该查看PEP 8,即 Python 代码样式指南:
包和模块名称 模块应使用简短的全小写名称。如果可以提高可读性,可以在模块名称中使用下划线。Python 包也应使用简短的全小写名称,但不鼓励使用下划线。
由于模块名称映射到文件名,并且某些文件系统不区分大小写并截断长名称,因此选择相当短的模块名称非常重要 - 这在 Unix 上不会是问题,但当代码传输到旧的 Mac 或 Windows 版本或 DOS 时可能会出现问题。
换句话说:重命名你的文件:)
解决方案 2:
代码中需要注意的另一件事是 import 不是一个函数。因此,正如一些人已经提到的import(python-code)
那样import python-code
,它被解释为“import python minus code”,而不是您想要的。如果您确实需要导入名称中带有破折号的文件,您可以执行以下操作::
python_code = __import__('python-code')
但是,正如上面提到的,这并不推荐。如果文件名是你能控制的,你应该更改它。
解决方案 3:
结论
破折号并不违法,但你不应该使用它们,原因有三:
需要特殊语法来导入带有破折号的文件
没人会想到模块名称中会有破折号
这违反了Python 风格指南的建议
如果您确实需要导入带破折号的文件名,则特殊语法如下:
module_name = __import__('module-name')
好奇为什么我们需要特殊语法?
之所以使用特殊语法,是因为您在编写时import somename
创建了一个带有标识符的模块对象somename
(因此您稍后可以使用它somename.funcname
)。 当然module-name
不是一个有效的标识符,因此使用特殊语法可以给出一个有效的标识符。
您不明白为什么模块名称不是有效的标识符?
别担心——我也没有。这里有一个技巧可以帮助您:看看这个 Python 行:x=var1-var2
。您是否在赋值右侧看到减法或带破折号的变量名?
附言
我的答案没有任何原创内容,只是将我认为与其他答案中最相关的信息放在一个地方
解决方案 4:
问题是python-code
不是标识符。解析器将其视为python
减号code
。当然,这不会满足您的要求。您需要使用也是有效 Python 标识符的文件名。尝试-
用下划线替换 。
解决方案 5:
在 Python 3 上使用import_module:
from importlib import import_module
python_code = import_module('python-code')
更一般地,
import_module('package.subpackage.module')
解决方案 6:
您可能可以通过一些__import__
hack 导入它,但如果您还不知道如何导入,则不应该这样做。Python 模块名称应该是有效的变量名称(“标识符”)——这意味着如果您有一个模块foo_bar
,您可以在 Python 内部使用它(print foo_bar
)。如果名称很奇怪,您将无法这样做(print foo-bar
-> 语法错误)。
解决方案 7:
尽管正确命名文件是最好的方法,但如果python-code
不受我们控制,使用黑客手段__import__
比复制、重命名或以其他方式弄乱其他作者的代码要好。但是,我试过了,除非我重命名文件并添加扩展名,否则它不起作用.py
。在查看 文档以了解如何获取描述后.py
,我最终得到了以下结果:
import imp
try:
python_code_file = open("python-code")
python_code = imp.load_module('python_code', python_code_file, './python-code', ('.py', 'U', 1))
finally:
python_code_file.close()
python-codec
它在第一次运行时创建了一个新文件。
扫码咨询,免费领取项目管理大礼包!