【问题标题】:Trouble using python/brownie in WSL在 WSL 中使用 python/brownie 遇到问题
【发布时间】:2021-12-22 17:04:48
【问题描述】:

我正在尝试从 freeCodeCamp video 完成简单的收藏 NFT 教程。 (我卡在了从链接时间戳开始的确切位置开始的脚本上。)

对于那些无法打开视频的人,我正在尝试运行这个 brownie 命令:

brownie run scripts/deploy_and_create.py --network rinkeby

我收到以下错误:

dsine@DESKTOP-T74SG6U:/mnt/c/Users/dylan/projects/demos/nft-demo$ brownie run scripts/deploy_and_create.py --network rinkeby
Brownie v1.17.1 - Python development framework for Ethereum

NftDemoProject is the active project.
  File "brownie/_cli/run.py", line 50, in main
    return_value, frame = run(
  File "brownie/project/scripts.py", line 53, in run
    module = _import_from_path(script)
  File "brownie/project/scripts.py", line 149, in _import_from_path
    _import_cache[import_str] = importlib.import_module(import_str)
  File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen, line line, in in
  File "<frozen, line line, in in
  File "<frozen, line line, in in
  File "<frozen, line line, in in
  File "<frozen, line line, in in
  File "<frozen, line line, in in
  File "<frozen, line line, in in
  File "<frozen, line line, in in
  File "<frozen, line line, in in
  File "<frozen, line line, in in
  File "<frozen, line line, in in
  File "<frozen, line line, in in
  File "<frozen, line line, in in
  File "<frozen, line line, in in
  File "<frozen, line line, in in
  File "<frozen, line line, in in
  File "<frozen, line line, in in
  File "<frozen, line line, in in
  File "<frozen, line line, in in
ModuleNotFoundError: No module named 'mnt.c.Users.dylan.projects'

我从 VSCode 中的 WSL Ubuntu 终端运行它。我也尝试在 powershell 中运行脚本。我确定我使用的是 Python 3 和 WSL 2。我不确定这里发生了什么。

这是我的 deploy_and_create.py 代码:

from scripts.helpful_scripts import get_account
from brownie import SimpleCollectible

sample_token_uri = "https://ipfs.io/ipfs/Qmd9MCGtdVz2miNumBHDbvj8bigSgTwnr4SbyH6DNnpWdt?filename=0-PUG.json"
OPENSEA_URL = "https://testnets.opensea.io/assets/{}/{}"

def main():
    account = get_account()
    simple_collectible = SimpleCollectible.deploy({"from":account})
    tx = simple_collectible.createCollectible(sample_token_uri, {"from": account})
    tx.wait(1)
    print(f"Awesome, you can view your NFT at {OPENSEA_URL.format(simple_collectible.address, simple_collectible.tokenCounter() - 1)}")
    print("Please wait up to 20 minutes and hit the refresh metadata button.")
    

还有我的 brownie-config.yaml:

dependencies:
  - OpenZeppelin/openzeppelin-contracts@3.4.0

compiler:
  solc:
    remappings:
      - '@openzeppelin=OpenZeppelin/openzeppelin-contracts@3.4.0'

dotenv: .env

谁能帮帮我?谢谢!

【问题讨论】:

标签: python ethereum solidity windows-subsystem-for-linux brownie


【解决方案1】:

在我看来,问题源于文件 brownie/project/scripts.py 中的函数 _import_from_path(应该在您的 eth-brownie 文件夹中找到,无论您安装在哪里)。它的编写方式会错误地将 Users.username 识别为“不是模块”。

解决方法:将 _import_from_path 替换为以下内容

def _import_from_path(path: Path) -> ModuleType:
    # Imports a module from the given path
    
    import_str = "/" + "/".join(path.parts[1:-1] + (path.stem,))+'.py'
    
    if import_str in _import_cache:
        importlib.reload(_import_cache[import_str])
    else:
        spec = importlib.util.spec_from_file_location('.'+path.stem,import_str)
        module = importlib.util.module_from_spec(spec)
        spec.loader.exec_module(module)
        _import_cache[import_str] = module
    return _import_cache[import_str]

说明:import_str 现在已修改为反映确切的文件位置而不是模块名称。 else: 块现在通过指定文件位置然后将该文件作为模块加载来导入模块。

【讨论】:

  • oo。如果这是布朗尼本身的问题,这可能是布朗尼回购的一个很好的公关。你认为这是一个布朗尼问题,而不是人员设置的问题?
  • 它可能 :) 这正是我过去解决的问题
  • 这绝对应该在没有问题的环境中进行测试。 _import_from_path 中似乎有问题,但我无法弄清楚为什么它在 2 个系统上的行为会有所不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2014-12-13
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
相关资源
最近更新 更多