打包后,module1无法从同一项目中“导入module2”

时间:2019-10-11 12:59:38

标签: python python-3.x module package

我的项目具有以下结构:

s3_to_redshift = 

    S3ToRedshiftOperator(task_id='{0}_to_Redshift'.format(table['name']),
                                  redshift_conn_id=REDSHIFT_CONN_ID,
                                   redshift_schema=REDSHIFT_SCHEMA_NAME,
                                              table=table,
                                              s3_conn_id=S3_CONN_ID,
                                              s3_bucket=S3_BUCKET,
                                              s3_key=S3_KEY,
                                              origin_schema=ORIGIN_SCHEMA,
                                              copy_params=COPY_PARAMS,
                                              schema_location=SCHEMA_LOCATION,
                                              load_type=table['load_type'],
                                              dag=dag)

使用:

  • project/ + setup.py + bobafett/ + __init__.py + __main__.py + foo.py :一个空文件
  • __init__.py:包含foo.py的定义:
bar
  • def bar(): print("foo.bar()") 导入并使用__main__.py
foo.bar

✓在本地,一切正常:

import foo
foo.bar()

✗打包,发布和安装~/project $ python3 bobafett/__main__.py foo.bar() 后,将不再找到bobafett

foo

那怎么样?我可以写什么而不是~/project $ python3 setup.py bdist_wheel ~/project $ curl -T ... https://my-pypi.example.com/simple/bobafett/... ~/project $ cd /tmp /tmp $ pip --index-url https://my-pypi.example.com/simple --user bobafett /tmp $ python -m bobafett ... File "/home/ysc/.local/lib/python3.6/site-packages/bobafett/__main__.py", line 1, in <module> import foo ModuleNotFoundError: No module named 'foo' 来写并且都可以在本地工作?我需要更改项目结构吗?


import foo

setup.py

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

  1. import foo更改为from . import foo。它将修复运行的python -m bobafett,但会破坏python3 bobafett/__main__.py
  2. 以与打包时相同的方式在本地运行:python -m bobafett而不是python3 bobafett/__main__.py