python - 导入运行脚本和作为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
我试图做些什么来解决它:
- 很多谷歌搜索
- 重命名包,可执行文件名
- 弄乱
__init__.py
文件(它们是空的) - 使用 virtualenv 确保旧版本等没有问题。
- 添加 . 在导入路径前面
这是我的代码:
安装程序.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 吗?
解决方案
我相信我已经找到了解决方案:
import os, sys
sys.path.append(os.path.split(os.path.abspath(__file__))[0])
在任何导入之前将其添加到主 python 文件中。它将主 python 文件的路径添加到系统路径,导入将开始工作。
推荐阅读
- ios - 在 UITableViewCell (Swift) 中重置步进器
- java - Spring Autowire 在通用类中找不到 R2DBC 存储库的实现
- image - Typo3 Fluid 忽略排版中设置的最大图像尺寸
- ios - UiCollectionview 单元格无法更改单元格大小
- javascript - 如何在javascript中将表格从垂直交换到水平?
- c# - 使用 Linq 更新列表的对象
- java - Paths.get("/xyz") 返回 \xyz 而不是 /xyz
- python - 如何从零除错误中纠正代码:
- android - 在颤振中使用 MVP 架构的 Chopper
- c# - 如何显示导数