基本上当我有一个python文件时:
python-code.py
并使用:
import (python-code)
解释器给了我语法错误。
关于如何解决它的任何想法?python文件名中的破折号是非法的吗?
您应该查看PEP 8,Python 代码的样式指南:
包和模块名称模块应该有简短的全小写名称。如果提高可读性,可以在模块名称中使用下划线。Python 包也应该有简短的全小写名称,尽管不鼓励使用下划线。
由于模块名称映射到文件名称,并且某些文件系统不区分大小写并截断长名称,因此选择相当短的模块名称很重要——这在 Unix 上不是问题,但它可能是将代码传输到较旧的 Mac 或 Windows 版本或 DOS 时出现问题。
换句话说:重命名你的文件:)
在您的代码中要注意的另一件事是 import 不是一个函数。正如一些人已经提到的那样,import(python-code)
应该将import python-code
其解释为“导入python减去代码”,而不是您想要的。如果您确实需要导入名称中带有破折号的文件,您可以执行以下操作:
python_code = __import__('python-code')
但是,如上所述,这并不是真正推荐的。如果文件名由您控制,则应更改文件名。
TLDR
破折号并不违法,但出于 3 个原因,您不应使用破折号:
如果您确实需要导入带有破折号的文件名,则特殊语法如下:
module_name = __import__('module-name')
好奇为什么我们需要特殊的语法?
特殊语法的原因是,当您编写时,import somename
您正在创建一个带有标识符的模块对象somename
(因此您以后可以将它与 eg 一起使用somename.funcname
)。当然module-name
不是一个有效的标识符,因此是给出有效标识符的特殊语法。
你不明白为什么 module-name 不是有效的标识符?
别担心——我也没有。这里有一个提示可以帮助你:看看这个 python 行:x=var1-var2
。您是否看到赋值右侧的减法或带有破折号的变量名?
附言
我的答案中没有任何原创内容,除了在一个地方包含我认为与所有其他答案中最相关的信息
问题是它python-code
不是标识符。解析器将此视为python
减号code
。当然,这不会满足您的要求。您将需要使用一个也是有效的 Python 标识符的文件名。尝试用-
下划线替换。
在 Python 3 上使用import_module:
from importlib import import_module
python_code = import_module('python-code')
更普遍,
import_module('package.subpackage.module')
您可能可以通过一些__import__
hack 导入它,但如果您还不知道如何导入,则不应该这样做。Python 模块名应该是有效的变量名(“标识符”)——这意味着如果你有一个模块foo_bar
,你可以在 Python ( print foo_bar
) 中使用它。您将无法使用奇怪的名称(print foo-bar
-> 语法错误)这样做。
尽管正确的文件命名是最好的方法,但如果python-code
不在我们的控制之下,那么使用 hack__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
它在第一次运行时创建了一个新文件。