在尝试导入Python文件时,可以在其中使用破折号吗?

在尝试导入Python文件时,可以在其中使用破折号吗?,python,naming,Python,Naming,基本上,当我有一个python文件时,如: python-code.py 和使用: import (python-code) 解释器给了我语法错误 有没有办法解决这个问题?python文件名中的破折号是否非法?问题在于python代码不是标识符。解析器将其视为python减去code。当然,这不会满足你的要求。您将需要使用同时也是有效python标识符的文件名。尝试用下划线替换-。您应该查看Python代码的样式指南: 包和模块名称模块应具有短的、全小写的名称。如果可以提高可读性,则可以在模

基本上,当我有一个python文件时,如:

python-code.py
和使用:

import (python-code)
解释器给了我语法错误


有没有办法解决这个问题?python文件名中的破折号是否非法?

问题在于
python代码
不是标识符。解析器将其视为
python
减去
code
。当然,这不会满足你的要求。您将需要使用同时也是有效python标识符的文件名。尝试用下划线替换
-

您应该查看Python代码的样式指南:

包和模块名称模块应具有短的、全小写的名称。如果可以提高可读性,则可以在模块名称中使用下划线。Python包也应该有短的、全小写的名称,尽管不鼓励使用下划线

由于模块名映射到文件名,并且某些文件系统不区分大小写,并且会截断长名称,因此选择相当短的模块名很重要——这在Unix上不会有问题,但在将代码传输到较旧的Mac或Windows版本或DOS时可能会有问题


换句话说:重命名你的文件:)

你可以通过一些
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。Python模块名称应该是有效的变量名称(“标识符”)——这意味着如果您有一个模块
foo\u bar
,您可以从Python中使用它(
print foo\u bar
)。如果使用奇怪的名称(
printfoobar
->语法错误),您将无法执行此操作。

在代码中要注意的另一件事是导入不是一个函数。因此,
import(python-code)
应该是
import-python-code
,正如一些人已经提到的,它被解释为“import-python-减号代码”,而不是您想要的。如果确实需要导入名称中带有破折号的文件,可以执行以下操作:

python_code = __import__('python-code')
但是,如上所述,这并不是真正的建议。如果文件名由您控制,则应更改它。

TLDR

破折号不是非法的,但您不应该使用破折号,原因有三:

  • 需要特殊语法才能导入带破折号的文件
  • 没有人希望模块名带有破折号
  • 这与委员会的建议背道而驰
  • 如果您确实需要导入带有破折号的文件名,则特殊语法如下:

    module_name = __import__('module-name')
    
    想知道为什么我们需要特殊语法吗?

    使用特殊语法的原因是,当您编写
    import somename
    时,您正在创建一个具有标识符
    somename
    的模块对象(以便以后可以将其与例如
    somename.funcname
    一起使用)。当然,
    模块名
    不是有效的标识符,因此特殊语法给出了有效的标识符

    您不明白为什么模块名不是有效标识符?

    别担心,我也没有。这里有一个提示可以帮助您:看看这条python代码行:
    x=var1-var2
    。您是否看到赋值右侧有减法或带破折号的变量名

    PS


    我的答案中没有任何原创内容,除了在一个地方包含我认为与所有其他答案最相关的信息位

    虽然正确的文件命名是最好的方法,但如果
    python代码不在我们的控制之下,使用
    \uuuu导入
    进行黑客攻击比复制、重命名,或者在其他作者的代码上乱搞。但是,我尝试了,除非我重命名文件并添加扩展名
    .py
    ,否则它无法工作。在研究如何获取
    .py
    的描述后,我得出以下结论:

    它在第一次运行时创建了一个新文件
    python codec

    在python 3上使用:

    更一般地说

    import_module('package.subpackage.module')
    

    这个问题与样式无关,它是一个语法错误,如下所示,仍然可能有一个同名的文件,因此样式指南非常相关。当您明确希望阻止导入时,在Python目录和文件名中使用连字符会非常有帮助。例如,在(比如)Django项目中,您可能有用Python编写的脚本,这些脚本不应作为应用程序寻址。您可以将它们放在类似于
    ops scripts
    的文件夹中,并且知道它们不能使用普通的包名称空间方法导入。或者一个脚本可以命名为
    stopwebsite.py
    ,以获得类似的效果。当然,其中任何一个都可以通过
    runpy
    和其他一些方法导入,但这有助于避免一些常见错误。重命名模块可能会有问题,尤其是当您依赖其他标准时。在我的例子中,我使用的是
    cgi-bin
    文件夹中的python cgi文件(对它们进行UnitTests),这是相当标准的afaik。除非你有这样一个罕见的例子,如果你有控制权,一定要重命名你的模块。我刚刚发现PyDev允许使用连字符的目录名,但不会显示该目录中包含的.py文件中的类和/或内部变量。+1。从未想过Python源代码的文件名应该是一个有效的标识符,因为该文件名将用于引用模块对象。@KevinAudleman您是否有将导入库与连字符文件一起使用的工作示例?我尝试了,但失败了。@TomHale importlib.import_模块('a.b.module-1')应该可以工作。如果你的导入模块不起作用,我想正常的导入也不起作用。我正在尝试使用这个导入一个带有连字符的pip包
    psycopg2\u binary=import\u模块('psycopg2-binary')
    。错误=>
    ModuleNotFoundError:没有名为'psycopg2 binary'的模块。
    。但是安装了
    psycopg2二进制文件。不知道如何包含它。也许这是一个路径问题。请看1>“TLDR”2>“我的答案中除了包含我认为
    
    from importlib import import_module
    python_code = import_module('python-code')
    
    import_module('package.subpackage.module')