首页 > 解决方案 > 导入运行脚本和作为setuptool生成的可执行文件运行的路径差异

问题描述

我有一个项目,我将其简化为以下演示代码结构:

[import_error]
    setup.py
    [import_test]
        __init__.py
        import_demo.py
        [common]
            __init__.py
            function.py

它使用 setup.py 中的 entry_points 来创建一个易于使用的可执行文件。它按应有的方式向/从我的私人 pi 服务器上传和安装。(devpi)

我的问题是,当我将脚本作为 py 文件运行时,function.py 的导入路径必须是:

from common.function import hello_world

但是当我通过 pip install 自动生成的可执行文件运行它时,我的导入路径必须是:

from import_test.common.function import hello_world

我试图做些什么来解决它:

这是我的代码:

安装程序.py

import setuptools

setuptools.setup(
    name="import_test",
    version='1.0.2',
    author="me",
    author_email="me@demo.com",
    url="www.google.dk",
    packages=setuptools.find_packages(),
    entry_points={
        'console_scripts': [
            'import_demo_exe=import_test.import_demo:main'
        ],
    },
)

import_demo.py

try:   
    from common.function import hello_world
    print('\n#function.py import does not need project prefix')
except:
    from import_test.common.function import hello_world
    print('\n#function.py import needs project prefix')

def main():
    hello_world()

if __name__ == '__main__':
    main()

函数.py

def hello_world():
    print('Hello World!')

当我从 cmd 行运行脚本时的输出:

>python import_demo.py
>#function.py import does not need project prefix
>Hello World!

pip install 后从 cmd 行运行可执行文件时的输出

>import_demo_exe
>#function.py import needs project prefix
>Hello World!

有没有人知道如何解决这个问题,所以我只需要在脚本中包含一个包含路径而不需要 try/except 吗?

标签: pythonpython-importsetuptools

解决方案


我相信我已经找到了解决方案:

import os, sys
sys.path.append(os.path.split(os.path.abspath(__file__))[0])

在任何导入之前将其添加到主 python 文件中。它将主 python 文件的路径添加到系统路径,导入将开始工作。


推荐阅读