基本上,当我有一个 Python 文件时,比如:
python-code.py
使用:
import (python-code)
解释器给我的语法错误。
对于如何修复它有什么想法吗? 破折号在 python 文件名中是非法的吗?
问题是 python-code不是一个标识符。解析器将其视为 python减去 code。这当然不会按你说的做。您将需要使用一个同时也是有效的 python 标识符的文件名。尝试用下划线替换 -。
python-code
python
code
-
你应该看看 PEP 8,Python 代码的样式指南:
包和模块名称模块应该有简短的全小写名称。如果下划线提高了可读性,可以在模块名称中使用。Python 包也应该有简短的全小写名称,尽管不鼓励使用下划线。 由于模块名称被映射到文件名,而且一些文件系统对大小写不敏感,并且会截断长名称,所以选择相当短的模块名称是很重要的——这在 Unix 上不会是一个问题,但是当代码被传输到旧的 Mac 或 Windows 版本,或者 DOS 时,这可能是一个问题。
包和模块名称模块应该有简短的全小写名称。如果下划线提高了可读性,可以在模块名称中使用。Python 包也应该有简短的全小写名称,尽管不鼓励使用下划线。
由于模块名称被映射到文件名,而且一些文件系统对大小写不敏感,并且会截断长名称,所以选择相当短的模块名称是很重要的——这在 Unix 上不会是一个问题,但是当代码被传输到旧的 Mac 或 Windows 版本,或者 DOS 时,这可能是一个问题。
换句话说: 重命名您的文件:)
你也许可以通过一些 __import__黑客技术导入它,但是如果你不知道如何导入,你就不应该这样做。Python 模块名称应该是有效的变量名称(“标识符”)——这意味着如果您有一个模块 foo_bar,您可以在 Python (print foo_bar)中使用它。如果使用奇怪的名称(print foo-bar-> 语法错误) ,就不能这样做。
__import__
foo_bar
print foo_bar
print foo-bar
在您的代码中还需要注意的一点是 import 不是一个函数。所以 import(python-code)应该是 import python-code,正如一些人已经提到的,它被解释为“ import python-code”,而不是你想要的。如果您确实需要导入名称中带有破折号的文件,您可以执行以下操作:
import(python-code)
import python-code
python_code = __import__('python-code')
但是,正如上面提到的,这并不是真正的建议。如果文件名是您控制的,那么您应该更改它。
TLDR
破折号是非法的 没有,但你不应该使用他们有3个原因:
如果您确实需要导入一个带破折号的文件名,那么特殊的语法如下:
module_name = __import__('module-name')
想知道我们为什么需要特殊的语法吗?
采用这种特殊语法的原因是,当您编写 import somename时,您正在创建一个带有标识符 somename的模块对象(因此您可以在以后使用它,例如 somename.funcname)。当然,module-name不是一个有效的标识符,因此提供了一个有效标识符的特殊语法。
import somename
somename
somename.funcname
module-name
你不明白为什么模块名称不是有效的标识符吗?
别担心,我也不知道。这里有一个小贴士可以帮助你: 看看这条蟒蛇线: x=var1-var2。你在赋值的右边看到一个减法或者一个带破折号的变量名吗?
x=var1-var2
附言
在我的回答中没有什么原创性,除了包括我认为最相关的信息位从所有其他答案在一个地方
虽然正确的文件命名是最好的方法,但是如果 python-code不在我们的控制之下,使用 __import__进行黑客攻击比复制、重命名或以其他方式扰乱其他作者的代码要好。但是,我试过了,除非我重命名添加 .py扩展名的文件,否则它不起作用。在查看了 医生以获得如何获得 .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。
python-codec
在 Python 3上使用 Import _ module:
from importlib import import_module python_code = import_module('python-code')
一般来说,
import_module('package.subpackage.module')